perm filename SW[SW,BGB] blob
sn#062494 filedate 1973-09-18 generic text, type T, neo UTF8
00100 COMMENT ⊗ VALID 00022 PAGES
00200 RECORD PAGE DESCRIPTION
00300 00001 00001 VALID 00022 PAGES
00400 00007 00002 TITLE SW SPACE WAR PROGRAM FOR STANFORD A.I. PROJECT
00500 00013 00003 SUBTTL ONCE-ONLY INITIALIZATION
00600 00018 00004 SUBTTL THE PDP-10 SPACE WAR MODULE
00700 00021 00005 SUBTTL CREATE STARS AND WON COUNTS
00800 00025 00006 SUBTTL INITIALIZE THE NEXT MATCH
00900 00028 00007 SUBTTL THE PDP-6 SPACE WAR MODULE
01000 00037 00008 SUBTTL THE MINE CALCULATIONS
01100 00043 00009 SUBTTL LAUNCH A TORPEDO
01200 00049 00010 SUBTTL XDRAW AND DRAW
01300 00055 00011 SUBTTL SIN, COS AND SQRT
01400 00057 00012 SUBTTL GRAV: CALCULATE SHIP POSITION
01500 00061 00013 SUBTTL SHIP - TORPEDO AND SHIP - MINE COLISION
01600 00068 00014 JS: DZM JSTB ZERO TABLE BEGINNING
01700 00070 00015 SUBTTL INSERT LOSER INTO NEW HYPERSPACE
01800 00072 00016 SUBTTL CODE FOR RUNTIME PARAMETER MODIFICATION
01900 00076 00017 GETNAM: ZAC B, ZERO B. WE ACCUMULATE RADIX 50
02000 00084 00018 SUBTTL TABLES FOR THE PARAMETER MODIFICATION
02100 00087 00019 SUBTTL DATA STORAGE FOR SPACEWAR
02200 00098 00020 SUBTTL ONCE ONLY SET PARAMETERS AT STARTUP
02300 00103 00021 SUBTTL MORE ONCE ONLY
02400 00104 00022 SUBTTL CONSTANTS
02500 00106 ENDMK
02600 ⊗;
00100 TITLE SW SPACE WAR PROGRAM FOR STANFORD A.I. PROJECT
00200 SUBTTL DEFINITIONS
00300
00400 COMMENT/
00500 REVISED SEPTEMBER 5,1971 R.E. GORIN
00600 FEB 1972 R TAYLOR
00700
00800 THIS PROGRAM IS BASED UPON A TRADITIONAL PROGRAM WRITTEN FOR
00900 THE PDP-1. ANY RESEMBLENCE TO OTHER PROGRAMS, LIVING OR DEAD, IS
01000 PURELY COINCIDENTAL
01100
01200 /
01300
01400 IFDEF FOR,<MACRO←←0;>MACRO==1 ;SELECT ASSEMBLER
01500
01600 IFE MACRO,<
01700 DEFINE DEF(A,B)<
01800 A←B>
01900 DEFINE SDEF(A,B)<
02000 A←←B>
02100 >
02200 IFG MACRO,<
02300 DEFINE DEF(A,B)<
02400 A=B>
02500 DEFINE SDEF(A,B)<
02600 A==B>
02700 >
02800 DEF(F,0)
02900 DEF(A,1)
03000 DEF(B,2)
03100 DEF(C,3)
03200 DEF(D,4)
03300 DEF(W,5)
03400 DEF(X,6)
03500 DEF(Y,7)
03600 DEF(SHIP,10)
03700 DEF(R11,11)
03800 DEF(R12,12)
03900 DEF(BFP,13)
04000 DEF(R14,14)
04100 DEF(R15,15)
04200 DEF(R16,16)
04300 DEF(P,17)
04400
04500 SDEF(VBRT,4000) ;LVW BRIGHTNESS FIELD
04600 SDEF(VSIZ,1000) ;LVW SIZE FIELD
04700 SDEF(VABS,100) ;LVW ABSOLUTE FIELD
04800 SDEF(VENDP,20) ;LVW ENDPOINT FIELD
04900 SDEF(VINVIS,40) ;LVW INVISIBLE FIELD
05000
05100
05200 ; SWITCHES
05300 SDEF(FAST,1) ;SET FOR FAST ACTION
05400 SDEF(HYPERS,0) ;SET FOR HYPERSSPACE
05500 SDEF(NHYP,1) ;SET FOR NEW HYPERSPACE
05600 IFG NHYP,< SDEF(HYPERS,0) ;CAN'T HAVE BOTH>
05700 SDEF(NMINE,4) ;SET TO THE MAXIMUM NUMBER OF MINES
05800 SDEF(NSHIP,5) ;SET FOR NUMBER OF SHIPS
05900 SDEF(PARM,1) ;FOR RUN TIME PARAMETER MODIFICATION
06000 SDEF(TEAMS,1) ;ON FOR TEAM SCORING
06100 IFL NSHIP-4,< SDEF(TEAMS,0) > ;TEAM SCORE ONLY FOR ≥4 SHIPS
06200 SDEF(GALAX,1) ;SET TO SHOW GALAXY'S SCORE
06300
06400 ; PARAMETERS
06500
06600 SDEF(PDLEN,10) ;PUSHDOWN LENGTH
06700 SDEF(NTORPM,40) ;MAXIMUM NUMBER OF TORPEDOES/PLAYER
06800 SDEF(LTBL,NSHIP*22) ;TORPEDO TABLE LENGTH
06900 ;SEE COMMENT BELOW
07000 SDEF(NSTAR,144) ;NUMBER OF STARS TO PUT OUT
07100
07200
07300 DEFINE LVW(X,Y,TYPE,MODE,BRT,SIZ)<
07400 IFIDN <MODE><a>,<SDEF(MD,1);>SDEF(MD,0)
07500 IFIDN <TYPE><i>,<SDEF(TT,2);>SDEF(TT,0)
07600 IFIDN <BRT><>,<SDEF(BQ,0);>SDEF(BQ,BRT)
07700 IFIDN <SIZ><>,<SDEF(SQ,0);>SDEF(SQ,SIZ)
07800 BYTE(11)<X>,<Y>(3)BQ,SQ(2)MD,TT(4)6
07900 >
08000
08100
08200 COMMENT/
08300 A LONG VECTOR WORD (LVW) FOR THE III DISPLAY HAS THE FOLLOWING FORMAT
08400
08500 BITS 0-10 X COORDINATE
08600 BITS 11-21 Y COORDINATE
08700 BITS 22-24 BRT BRIGHTNESS. 0=NO CHANGE, 1-7 INCREASING BRIGHTNESS
08800 BITS 25-27 SIZ SIZE. 0=NO CHANGE, 1-7 INCREASING BRIGHTNESS
08900 BIT 29 M MODE. 0=RELATIVE TO LAST, 1=ABSOLUTE FROM CENTER
09000 BITS 30-31 T TYPE. 0=VISIBLE, 1=ENDPOINT, 2=INVISIBLE
09100 BITS 32-35 6. DENOTES LVW IN DISPLAY PROCESSOR
09200
09300 /
09400
09500 ; OPDEFS
09600
09700 OPDEF UPGIOT [703B8] ;DISPLAY A PIECE OF GLASS
09800 OPDEF SPCWAR [CALLI 400000] ;READ SW BUTTONS
09900 OPDEF SPCWGO [CALLI 400003] ;INITIATE A SPACE WAR MODULE
10000 OPDEF EIOTM [CALLI 400005] ;ENTER IOT USER MODE
10100 OPDEF LIOTM [CALLI 400006] ;LEAVE IOT USER MODE
10200 OPDEF DISMIS [CALLI 400024] ;DISMISS SW MODULE
10300 OPDEF RESET [CALLI 0] ;IO AND SW RESET
10400 OPDEF SLEEP [CALLI 31] ;SLEEP UUO
10500 OPDEF CORE [CALLI 11] ;CORE UUO
10600 OPDEF EXIT [CALLI 12] ;STOP MY JOB
10700 OPDEF TTCALL [51B8] ;TELETYPE IO
10800
10900 COMMENT/
11000 SPCWGO:
11100 SET AC = XWD BITS,,ADR
11200 ADR IS THE ADDRESS OF THE SW MODULE
11300 BITS IS:
11400 BIT 0 = RUN THIS ON THE PDP-10
11500 BIT 1 = RUN THIS ON THE PDP-6
11600 BITS 14-17 = NUMBER OF TICKS BETWEEN STARTUPS
11700
11800 UPGIOT:
11900 AC = PIECE OF GLASS NUMBER.
12000 ADDRESS IS FOR A TWO WORD BLOCK
12100 WORD0: ADDRESS OF DPY PROGRAM
12200 WORD1: LENGTH OF DPY PROGRAM
12300 PROGRAM IS RUN ON THE PIECE OF GLASS NAMED
12400 /
12500
12600 COMMENT $ REGARDING THE SPACE ALLOWED FOR CERTAIN THINGS:
12700
12800 1. THE NUMBER OF TORPEDOES THAT A SHIP CAN HAVE ACTIVE
12900 IS BOUNDED BY 2+2*[TLIFE/TRELOD].
13000
13100 2. ASSUMING THAT TLIFE ≤ 200 AND TRELOD ≥ 20 THEN
13200 EACH SHIP CAN HAVE < 18. TORPEDOES ACTIVE.
13300
13400 3. THEREFORE, LTBL = 18 * NSHIP
13500
13600 4. EACH SHIP MUST BE ≤ 150 (OCTAL) POINTS, INCLUDING FLAME
13700
13800 5. MINES ARE USUALLY 2 DPY WORDS. IN CASE OF EXPLOSION,
13900 THEY ARE 10. WORDS.
14000
14100 6. THE MAIN BUFFER LENGTH, THEREFORE IS GIVEN BY THE EXPRESSION:
14200
14300 1+12*NMINE+150*NSHIP+LTBL
14400 $
14500
14600 DEF(BUFLEN,1+12*NMINE+150*NSHIP+LTBL)
14700
14800 EXTERN JOBREL,JOBFF,JOBDDT
00100 SUBTTL ONCE-ONLY INITIALIZATION
00200 STRT: RESET ;RESET SPACEWAR
00300 MOVEI 1,DISTAB
00400 DAC 1,137 ;SAVE POINTER TO DATA
00500 LAC P,PDP ;GET A PDL
00600 PUSHJ P,SETP ;SET ALL THE PARAMETERS
00700 TTCALL 3,[BYTE(7)14,14,14,15] ;CLEAR SCREEN
00800 SETO A, ;SET FOR THIS JOB'S LINE
00900 TTCALL 6,A ;GET OUR LINE NUMBER
01000 CAR A,A ;WIPE OUT ALL BUT THE NUMBER
01100 CAIG A,25 ;SKIP IF NOT A III
01200 CAIGE A,20 ;SKIP IF A DPY
01300 EXIT ;THIS FOOL'S NOT AT A III
01400 SUBI A,20 ;NORMALIZE
01500 TRO A,100 ;TURN ON A BIT
01600 DAC A,LINE ;SAVE AS OUR LINE NUMBER
01700 LAC A,TRELOD ;GET THE RELOAD TIME
01800 LSH A,-1 ;HALVE IT
01900 SKIPN TUBES ;SKIP IF WE HAVE TWO TUBES
02000 DAC A,LATNCY ;SAVE AS LATENCY TIME
02100 MOVEI SHIP,0 ;FOR ALL SHIPS
02200 MOVEI BFP,CNTTBL ;ADDRESS OF COUNT TABLE
02300 PUSH BFP,GLOC ;POINTER TO GALAXY COUNT LOCATOR
02400 PUSH BFP,[<ASCII/ />+1] ;GALAXY SCORE
02500 STRT0: PUSH BFP,COUNTP(SHIP) ;LVW TO POSITION COUNT
02600 PUSH BFP,[<ASCII/ />+1] ;INITIAL TEXT
02700 DZM ZOWSW(SHIP) ;SET INITIALLY TO NEUTRAL
02800 DZM NUMWN(SHIP) ;AND NO WINS
02900 CAMGE SHIP,NSHIPX ;DONE ENOUGH?
03000 AOJA SHIP,STRT0 ;NO: LOOP
03100 MOVSI R11,-200 ;CREATE -COS,,SIN TABLE
03200 SETZB SHIP,GALAXY ;SIN/COS FOR 0 TO 2π, 200(OCTAL) STEPS
03300 STRT1: LAC A,SHIP ;GET THE ARGUMENT
03400 PUSHJ P,COS ;GET THE COSINE
03500 FIX A,200000 ;CONVERT TO INTEGER
03600 MOVNM A,TAB(R11) ;SAVE IN THE TABLE
03700 LAC A,SHIP ;GET THE SAME ARGUMENT
03800 PUSHJ P,SIN ;GET THE SINE
03900 FIX A,200000 ;FIX IT
04000 HLRM A,TAB(R11) ;SAVE IT
04100 FAD SHIP,[0.049087] ;2π/128
04200 AOBJN R11,STRT1 ;LOOP FOR MORE
04300 MOVSI A,1000 ;THIS HACK FIXES THE ONE ENTRY
04400 DAC A,TAB+100 ;IN THE TABLE THAT LOSES OTHERWISE
04500 SETOM QRSTRT ;SET TO INITIALIZE A GAME
04600 SKIPE TENSW ;DO WE USE THE 10 ONLY?
04700 GO PDP10G ;YES. INITIATE SW MODULE
04800 SKIPE DEBUG ;ARE WE DEBUGGING
04900 GO SW6GO ;YES: DON'T START SPACE WAR MODULE
05000 SETOM SIXSW ;CORE CELL FOR PDP6 STATUS
05100 LAC A,[XWD 400000,ONETIK] ;ONE TICK TO DISCOVER PDP6 STATE
05200 SPCWGO A, ;RUN IN PDP-10 SW MODE FOR ONE TICK.
05300 SKIPGE SIXSW ;WAIT FOR SW TICK TO HAPPEN
05400 GO .-1 ;KEEP WAITING
05500 SKIPE SIXSW ;OK. IS PDP-6 ALIVE?
05600 GO PDP10G ;NO: RUN EVERYTHING ON THE PDP-10
05700 LAC A,[XWD 200003,SW6GO] ;THREE TICK SERVICE ON THE PDP-6
05800 SPCWGO A, ;REQUEST SERVICE
05900 LAC A,[XWD 400002,SW10GO] ;TWO TICK SERVICE ON THE PDP-10
06000 GO PDP10H ;REQUEST USUAL SERVICE ON PDP-10
06100 PDP10G: SETOM TENSW ;FLAG TO SAY USE THE 10 ONLY
06200 LAC A,[XWD 400003,SW6GO] ;RUN EVERYTHING FROM PDP10
06300 PDP10H: SPCWGO A, ;SET UP MODULE
06400 IFE PARM,<
06500 MOVEI A,2 ;GO INTO A SLEEP LOOP
06600 SLEEP A, ;SNOOZE
06700 GO .-2 ;AND SNOOZE MORE
06800 >
06900 IFG PARM,<
07000 DZM LPARM ;ZERO LAST PARM CELL
07100 PARMS: LAC P,UPDL ;LOAD USER MODE PDL
07200 PUSHJ P,RPARM ;READ PARAMETERS
07300 GO PARMS ;LOOP
07400 >
07500 ONETIK: MOVMM 5,SIXSW ;0 ⊃ OK, 1 ⊃ PDP6 SICK
07600 DISMIS ;DISMIS THE SW JOB.
07700 SETP: SKIPE CLOBR ;HAS HI CORE BEEN CLOBBERED?
07800 POPJ P, ;YES. CAN'T CHANGE ANYTHING
07900 GO SETALL ;NO. WE CAN SET ALL THE STUFF
00100 SUBTTL THE PDP-10 SPACE WAR MODULE
00200 SW10GO: SKIPN SIXDON ;SKIP IF PDP-6 IS READY
00300 GO NORUN1 ;NOT READY. DON'T RUN THIS MODULE.
00400 DZM SIXDON ;ZERO PDP-6 FLAG
00500 SKIPN DDSW
00600 GO SW10G1 ;DON'T READ KEYBOARD
00700 SKIPE DEBUG ;ARE WE AT USER MODE
00800 EIOTM ;YES, ENTER IOT USER MODE
00900 DATAO 310,LINE ;SELECT KEYBOARD NUMBER
01000 DATAI 310,A ;READ THE BITS FROM HIS LINE
01100 TRC A,1700
01200 DAC A,BITS
01300 SKIPE DEBUG ;IF DEBUGGING THEN LEAVE IOT MODE
01400 LIOTM ;LEAVE IOT MODE
01500 SW10G1: GO 3,@[.+1] ;JUMP AND SET USER
01600 SKIPN STARFG ;ARE THE STARS OUT YET?
01700 GO SW10ST ;STARS DONE ALREADY
01800 SOSGE A,CDOWN ;ARE WE DONE WITH COUNT DOWN?
01900 GO ST.NOW ;YES. TIME TO SHOW THE STARS
02000 LSH A,-2 ;DIVIDE BY 8
02100 IORI A,141 ;MAKE INTO A DIGIT WITH LSB
02200 DAC A,CTIM ;SAVE IT
02300 LAC A,SELWRD
02400 DAC A,CTIM1
02500 UPGIOT 10,CTIME ;DISPLAY
02600 UPGIOT 11,CTIME
02700 GO SW10ST ;SKIP DISPLAY OF STARS
02800 ST.NOW: UPGIOT 10,STADR ;TIME TO DRAW THEM.
02900 DZM STARFG ;TELL PDP-6 THAT STARS ARE OUT
03000 SW10ST: AOSN SHIPFG ;MUST WE DRAW THE SHIPS?
03100 UPGIOT 11,BPTRX ;YUP
03200 AOSN CNTFG ;TIME TO SHOW NEW COUNTS?
03300 UPGIOT 12,CNTPNT ;DISPLAY THEM
03400 SW10DN: SETOM TENDON ;SET TO INDICATE THE TEN HAS FINISHED.
03500 NORUN1: SKIPN TENSW
03600 SKIPE DEBUG ;ARE WE DEBUGGING?
03700 CPOPJ: POPJ P, ;YES RETURN.
03800 DISMIS ;NO DEBUGGING: DISMISS SW
03900
00100 SUBTTL CREATE STARS AND WON COUNTS
00200 STARS: LAC A,RCONST ;INITIALIZE RANDOM NUMBERS
00300 LAC D,RANDX ;LOAD OLD RANDOM THING
00400 MOVEI W,NSTAR-1 ;NUMBER OF STARS TO MAKE
00500 SL1: ADD D,A ;MAKE A RANDOM NUMBER
00600 LAC C,A ;SAVE IT IN C
00700 ADD A,D ;MAKE ANOTHER RANDOM NUMBER
00800 PUSHJ P,PLT1 ;CONVERT C TO LVW COORDINATES
00900 IORI C,526 ;TURN ON END POINT AND LVW BITS SIZ=1
01000 DPB A,[POINT 3,C,24] ;DEPOSIT A RANDOM BRIGHTNESS
01100 DAC C,STARBF(W) ;STUFF THIS IN THE STAR TABLE
01200 SOJGE W,SL1 ;BACK UNTIL THE TABLE IS FULL
01300 DAC A,RANDX ;SAVE UPDATED NUMBER FOR NEXT TIME
01400 SETOM STARFG ;SEND OUT STARS
01500 MOVEI A,60
01600 DAC A,CDOWN
01700 LAC A,NSHIPX ;FOR ALL SHIPS,
01800 SKIPN ZOWSW(A) ;DID HE LOSE?
01900 SOJGE A,.-1 ;LOOK FOR ONE LOSER
02000 JUMPL A,CNT4 ;NO LOSERS
02100 LAC A,NSHIPX ;COMPUTE SCORES AT RESTART
02200 LAC B,SURBEN ;SURVIVORS BENEFIT
02300 CNT3: SKIPN ZOWSW(A) ;SKIP IF THIS GUY LOST
02400 ADDM B,NUMWN(A) ;WINNER, INCREASE HIS SCORE.
02500 SOJGE A,CNT3 ;LOOP
02600 CNT4: LAC B,NSHIPX ;UPDATE ALL SCORES
02700 CNT5: LAC C,NUMWN(B) ;LOAD A SCORE
02800 SKIPN DOTEAM ;REALLY DOING TEAMS?
02900 GO CNT5A ;NOPE
03000 ADD C,NUMWN-1(B) ;GET THE OTHER GUY'S SCORE
03100 SUBI B,1 ;DECREMENT B AN EXTRA TIME
03200 CNT5A: LAC W,B
03300 LSH W,1
03400 ADD W,[POINT 7,CNTTBL+4] ;ADD IN THE BYTE POINTER
03500 PUSHJ P,DECDPX ;WRITE SCORES
03600 SOJGE B,CNT5 ;LOOP
03700 CNT6: LAC C,GALAXY ;GET OVERHEAD COUNT
03800 LAC W,[POINT 7,CNTTBL+2] ;TEXT POINTER
03900 PUSHJ P,DECDPX ;COUNT GALATIC OVERHEAD
04000 LAC B,NSHIPX ;COMPUTE LENGTH OF COUNT TABLE
04100 LSH B,1
04200 ADDI B,5
04300 SKIPN GSCORE
04400 SUBI B,2 ;NO GALATIC SCORE
04500 DAC B,CNTPNT+1 ;SAVE AS LENGTH TO DISPLAY
04600 MOVEI B,CNTTBL ;GET TABLE ADDRESS
04700 SKIPN GSCORE
04800 ADDI B,2 ;POINT PAST GALAXY SCORE
04900 DAC B,CNTPNT ;SET POINTER
05000 SKIPE CNTR ;SKIP IF NO COUNTS
05100 SETOM CNTFG ;ANNOUNCE THAT COUNTS ARE THERE
05200 POPJ P, ;RETURN TO GAME
05300 DECDPX: MOVEI D,1 ;SET TEXT BIT
05400 DAC D,(W) ;IN THE WORD
05500 JUMPGE C,DECDPB ;GO PRINT
05600 MOVEI D,"-" ;IF THIS IS EVER NEEDED
05700 IDPB D,W ;WE'LL HAVE IT
05800 MOVM C,C ;GET ABS C
05900 DECDPB: IDIVI C,12 ;ROUTINE USED TO DISPLAY THE
06000 HRLM D,(P) ;WIN COUNTS
06100 JUMPE C,.+2 ;THIS SAVES DIGITS ON THE STACK
06200 PUSHJ P,DECDPB ;BY WIPING THE FLAGS
06300 CDR D,(P) ;WHICH IS FASTER THAN PUSHIMG
06400 ADDI D,"0" ;THIS DEPOSITS TEXT USING
06500 IDPB D,W ;W. ASSUMES LESS THAN 5 CHARACTERS
06600 POPJ P, ;IN DECIMAL EXPANSION
00100 SUBTTL INITIALIZE THE NEXT MATCH
00200
00300 GAME: PUSHJ P,STARS ;MAKE THE STARS COME OUT
00400 SETZB A,GOBEG ;ZERO STUFF FOR NEW PLAY
00500 LAC B,[XWD GOBEG,GOBEG+1] ;LOAD A BLT POINTER
00600 BLT B,GOEND ;ZERO THROUGH HERE
00700 SETOM MINSTR ;MAKE THE MINES GET MADE
00800 LAC SHIP,NSHIPX ;FOR EVERY SHIP,...
00900 GAME1: PUSHJ P,GAME2 ;INITIALIZE A SHIP
01000 SOJGE SHIP,GAME1 ;LOOP
01100 POPJ P, ;RETURN
01200 GAME2: LAC B,NTORPS ;GET TORPEDO COUNT
01300 LAC C,NSHIPX ;RESET EVERYONE'S TORP COUNT
01400 DAC B,TPCN(C) ;SET TORPEDO COUNT
01500 SOJGE C,.-1 ;LOOP
01600 SKIPN RSPSWT ;DO WE WANT RANDOM START
01700 GO STDPSS ;NO USE STANDARD
01800 LAC C,RCONST
01900 LAC D,C
02000 ADDB C,RANDX ;GET A RANDOM NUMBER
02100 ADDB D,RANDX ;ANOTHER ONE
02200 ANDI D,177 ;A DIRECTION
02300 MOVSM D,SRA(SHIP) ;SHIP ROTATION
02400 ROT C,-12 ;WANT MORE RANDOMNESS HERE
02500 TSC C,C ;AND YET MORE
02600 ADD C,D ;AND STILL MORE
02700 ANDI C,177 ;GET A DIRECTION
02800 LAC C,TAB(C) ;GET MULTIPLIER
02900 IMULI C,240 ;LAC THE GUY
03000 DAC C,SP(SHIP) ;SAVE SHIP POS
03100 GO PUTSTF ;GO DO REST
03200 STDPSS: LAC C,IROT(SHIP) ;GET INITIAL ORIENTATION
03300 MOVSM C,SRA(SHIP) ;SAVE
03400 LAC C,IPOS(SHIP) ;GET INITIAL POSITION
03500 DAC C,SP(SHIP) ;SAVE SHIP POSITION
03600 PUTSTF: HLRE D,C ;GET -2Y INTO D
03700 HRRE C,C ;2X IN C
03800 FSC C,223 ;FLOAT POSITIONS
03900 FSC D,223 ;FLOAT POSITIONS
04000 DAC C,SX(SHIP) ;SAVE X POSITION
04100 MOVNM D,SY(SHIP) ;SAVE --Y POSITION
04200 LAC C,ALLBIT(SHIP)
04300 ANDCAM C,DMASK ;INITIALIZE DAMAGE MASK
04400 DZM ZOWSW(SHIP) ;SHIP NOT EXPLODED
04500 DZM HYPER(SHIP) ;NOT IN HYPER SPACE
04600 DZM TCNT0(SHIP) ;TUBE 0 READY NOW
04700 DZM TCNT1(SHIP) ;TUBE 1 READY NOW
04800 DZM UTUBE(SHIP) ;TUBE 0 UP NEXT
04900 DZM SV(SHIP) ;NO VELOCITY
05000 DZM SVX(SHIP) ;...
05100 DZM SVY(SHIP) ;...
05200 DZM ZORCHP(SHIP) ;ZORCH IS UNBEGUN
05300 DZM HYPCNT(SHIP) ;RESET HYPERSPACE COUNT
05400 POPJ P, ;RETURN
00100 SUBTTL THE PDP-6 SPACE WAR MODULE
00200 SW6GO: LAC P,PDP ;GET A PDL
00300 SKIPE DEBUG
00400 SPCWAR A, ;READ BUTTONS IF NOT SPACEWAR
00500 TRC A,2 ;AS OF 27 JAN 73, THIS BIT IS INVERTED (BECAUSE OF A N.O. SWITCH).
00600 DAC A,SWBUT ;SAVE SW BUTTON
00700 SKIPN TENSW
00800 SKIPE DEBUG ;ARE WE ON THE PDP-10
00900 PUSHJ P,SW10GO ;YES: FAKE THE 10 SW MODULE
01000 LAC B,TENDON ;IS PDP-10 READY?
01100 JUMPE B,NORUN2 ;NOT YET. HOLD THIS UP
01200 DZM TENDON ;CLEAR PDP-10 FLAG
01300 LAC A,SWBUT ;GET BUTTONS INTO A
01400 SKIPN DDSW
01500 GO SW6GO1
01600 LSH A,14 ;SHIFT SW BITS 8 PLACES
01700 CAR B,BITS ;GET LINE BITS
01800 TRZ B,770000 ;SHUT OFF SPURIOUS BITS
01900 IOR A,B ;OR THE BUTTON BITS WITH SW BITS
02000 SW6GO1: AOSN QRSTRT ;TEST THE RESTART FLAG
02100 PUSHJ P,GAME ;TIME FOR A NEW GAME
02200 SKIPN STARFG ;ARE THE STARS OUT YET
02300 GO SWG1 ;YES, ALL OK
02400
02500 NORUN2: SETOM SIXDON ;TELL PDP-10 WE ARE READY
02600 SKIPE DEBUG ;ARE WE DEBUGGING?
02700 GO SW6GO ;YES: WE'LL SOON FORCE THE STARS
02800 DISMIS ;NO. INTERLOCK WITH PDP-10
02900 ;UNTIL HE FINISHES WITH STABLE
03000 SWG1: LAC SHIP,NSHIPX ;SHUT OFF BITS FROM ANYONE ZAPPED
03100 SWG1.1:
03200 IFN NHYP,< ;COMPILE FOR NEW HYPER SPACE
03300 SKIPLE HYPER(SHIP) ;IF IN NEW HYPERSPACE
03400 TDZ A,ALLBIT(SHIP) ;ZERO ALL HIS BITS
03500 >
03600 SKIPN ZOWSW(SHIP) ;EXPLODED?
03700 GO SWG1.2 ;NOT EXPLODED
03800 TDZ A,ALLBIT(SHIP) ;ZERO HIS BITS
03900 AOSE RESTAR(SHIP) ;INCREMENT HIS RESTART DELAY
04000 GO SWG1.2 ;NOT READY TO RESTART
04100 SKIPL QRSTRT ;SET TO RESTART GAME?
04200 PUSHJ P,GAME2 ;NO: RESTART THIS PLAYER
04300 SWG1.2: SOJGE SHIP,SWG1.1 ;LOOP
04400 PUSHJ P,JS ;GO DOWN AND INTERPRET THE BUTTONS
04500 MOVEI BFP,BUF-1 ;INITIALIZE BUFFER DEPOSIT POINTER
04600 PUSH BFP,ZERO ;START THE BUFFER WITH A ZERO
04700 LAC SHIP,NSHIPX ;FOR ALL SHIPS DO:
04800 SWG2:
04900 IFN HYPERS,< ;IF HYPER SPACE IS AVAILABLE
05000 LAC W,HYPEN ;RELOAD PENALTY FOR HYPERSPACE
05100 LAC X,UTUBE(SHIP) ;GET HIS NEXT TUBE NUMBER
05200 SOSN HYPER(SHIP) ;DECREASE HYPER COUNT
05300 DAC W,@RDELAY(X) ;PENALIZE HIS RELOAD DELAY
05400 >
05500 IFN NHYP,<
05600 SOSLE B,HYPER(SHIP) ;DECREMENT HYPERTIME
05700 GO SWG2.1 ;STILL IN HYPERSPACE
05800 JUMPL B,SWG2.0 ;NOT IN HYPERSPACE AT ALL
05900 MOVEI B,4 ;EXPLOSION CODE
06000 SKIPL HYPCNT(SHIP) ;SKIP IF EXPLODE IN HYPER-SPACE
06100 GO SWG2.0 ;OK THIS GUY LIVES STILL
06200 DAC B,ZOWSW(SHIP) ;POOF!
06300 PUSHJ P,QRST0 ;SET UP A RESTART
06400 >
06500 SWG2.0: SOS TCNT0(SHIP) ;DEC SHIP n TUBE 0 DELAY
06600 SOS TCNT1(SHIP) ;DEC SHIP n TUBE 1 DELAY
06700 LAC F,SRX(SHIP) ;GET ROTATIONAL INCREMENT
06800 FIX F,211000 ;FIX ON THE 10
06900 ADDB F,SRA(SHIP) ;UPDATE SHIP ORIENTATION
07000 TLZ F,777600 ;ZERO ALL BUT INDEX BITS
07100 HLRZM F,SR(SHIP) ;SAVE ORIENTATION INDEX
07200 PUSHJ P,STCOL ;COMPUTE POSSIBLE COLLISIONS
07300 PUSHJ P,GRAV ;COMPUTE GRAVITATIONAL INFLUENCE
07400 SWG2.1: SOJGE SHIP,SWG2 ;FOR SHIP=1 AND SHIP=0
07500 PUSHJ P,MINE ;DO ALL MINE CALCULATIONS
07600 LAC SHIP,NSHIPX ;THE NEXT SECTION FOR SHIP = 1, 0
07700 SWG3: LAC R16,SP(SHIP) ;GET THE SHIP POSITION
07800 LAC R15,SR(SHIP) ;GET THE SHIP ORIENTATION INDEX
07900 LAC W,TAB(R15) ;GET THE CORRESPONDING COS-SIN
08000 IMUL W,SPTAB(SHIP) ;MULTIPLY BY MAJIC NUMBER
08100 ADD R16,W ;ADD IT IN
08200 DAC R16,STEMP(SHIP) ;SAVE THE NOSE OF SHIP POSITION
08300 LAC R14,SPICT(SHIP) ;GET ADDRESS OF PICTURE
08400 PUSHJ P,XDRAW ;DRAW THE SHIP
08500 TDNE A,TPBIT(SHIP) ;IS HE FIRING TORPEDOES?
08600 PUSHJ P,CTORP ;TRY TO LAUNCH A TORPEDO
08700 SKIPG HYPER(SHIP) ;NO FLAME FROM HYPER SPACE
08800 SKIPN STX(SHIP) ;ANY THRUST
08900 GO SWG4 ;NO FLAME
09000 LAC R15,SR(SHIP) ;GET THE SHIP ORIENTATION
09100 LAC R15,TAB(R15) ;GET THE COS-SIN TABLE ENTRY
09200 LAC R16,SP(SHIP) ;GET THE BASIC POSITION
09300 IMUL R15,TFTAB(SHIP) ;MULTIPLY BY MAJIC NUMBER
09400 SUB R16,R15 ;SUBTRACT FROM THE BASIC POSITION
09500 LAC R15,SR(SHIP) ;GET ORIENTATION
09600 LAC W,RAND ;GET RANDOM NUMBER
09700 ROT W,1 ;ROTATE IT
09800 DAC W,RAND ;REPLACE THIS IN CORE
09900 TLO W,777760 ;TURN ON BITS: MAKE A RANDOM LENGTH
10000 HRRI W,100 ;SET ORIENTATION=100, DOWN
10100 MOVEI R14,W ;R14 POINTS TO W
10200 MOVEI X,0 ;W+1 IS ZERO TERMINATES LIST
10300 PUSHJ P,DRAW ;DRAW THE FLAME
10400 SWG4: SOJGE SHIP,SWG3 ;DO ALL THAT FOR SHIP=1 AND 0
10500 ZAC W, ;UPDATE TORPEDOES.
10600 SWG5: CAML W,TPNT ;ARE WE STILL IN TABLE?
10700 GO SWG6 ;NOPE: ALL DONE
10800 SKIPG TL(W)
10900 GO Z6 ;TORP EXPIRED
11000 SOS Y,TL(W) ;DECREMENT TORP LIFE
11100 TRNN Y,-1 ;SKIP IF TIME >0
11200 GO Z6 ;THIS TORPEDO HAS EXPIRED
11300 LAC X,TP(W) ;GET THE POSITION
11400 ADD X,TV(W) ;ADD THE VELOCITY
11500 LAC C,X ;SAVE NEW POSTION IN C
11600 PUSHJ P,PLT1 ;FOR CALL ON PLT1
11700 IORI C,11126 ;LVW WITH ENDPOINT,SIZ=BRT=2
11800 CAIGE Y,10 ;IS THIS ABOUT TO EXPIRE?
11900 IORI C,37400 ;YES: TURN ON BRIGHT AND BIG SIZE
12000 PUSH BFP,C ;SAVE THIS IN THE DPY BUFFER
12100 EXCH X,TP(W) ;SWAP NEW-OLD POSITION
12200 XOR X,TP(W) ;XOR NEW AND OLD
12300 TDNN X,[XWD 400000,400000] ;IF THESE BITS SET THEN SKIP
12400 AOJA W,SWG5 ;LOOK AT NEXT TORP
12500 LAC F,TV(W) ;POSSIBLE WRAP OVER. GET VELOCITY
12600 XOR F,TP(W) ;XOR WITH NEW POSITION
12700 AND X,F ;AND WITH THE XOR OF OLD-NEW
12800 TDNE X,[XWD 400000,400000] ;IF THESE ARE STILL SET
12900 PUSHJ P,TCOL ;THEN WE HAVE WRAPPED. CHECK TCOL
13000 AOJA W,SWG5 ;LOOK FOR MORE
13100 Z6: SOS X,TPNT ;TORP HAS EXPIRED
13200 CAML W,X ;THIS THE LAST IN TABLE?
13300 GO SWG6 ;YES: OUT OF THE LOOP
13400 LAC Y,TP(X) ;GET LAST FROM TABLE
13500 DAC Y,TP(W) ;USE IT TO WIPE THIS ONE
13600 LAC Y,TV(X) ;...
13700 DAC Y,TV(W) ;...
13800 LAC Y,TL(X) ;...
13900 DAC Y,TL(W) ;...
14000 LAC Y,TVX(X) ;...
14100 DAC Y,TVX(W) ;...
14200 LAC Y,TVY(X) ;...
14300 DAC Y,TVY(W) ;...
14400 GO SWG5 ;LOOK FOR MORE. DONT CHANGE W.
14500 SWG6: HLRZM BFP,BPTRX+1 ;STORE NUMBER OF WORDS TO DISPLAY
14600 SETOM SHIPFG ;TELL PDP-10 WE HAVE A DISPLAY READY
14700 SETOM SIXDON
14800 SKIPN DEBUG ;ARE WE USING DDT?
14900 DISMIS ;NOPE: DISMISS THIS SW MODULE
15000 ZAC B, ;GO TO SLEEP FOR A WHILE
15100 SLEEP B, ;SLEEP 1 TICK
15200 GO SW6GO ;A GO TO WORK AGAIN
00100 SUBTTL THE MINE CALCULATIONS
00200 IFE NMINE,<
00300 MINE: POPJ P, ;NO MINES
00400 >
00500 IFG NMINE,<
00600 MINE: LAC SHIP,NMINEX ;ALL THE CALCULATIONS FOR THE MINES
00700 ADDI SHIP,NSHIP-1 ;ADD TO INDEX THE MINE TABLES
00800 LAC R15,BFP ;SAVE BFP TO LEARN IF ANY ARE ALIVE
00900 MINE1: CAIG SHIP,NSHIP-1 ;ARE WE DONE YET?
01000 GO MINE6 ;YES. TO EXIT STUFF
01100 SKIPN C,SP(SHIP) ;GET MINE POSITION
01200 SOJA SHIP,MINE1 ;MINE IS DEAD
01300 HLRE B,C ;GET MINE -2Y
01400 HRRE C,C ;GET MINE 2X
01500 MOVEI R12,1 ;1 = TORPS, 0 = MINES
01600 LAC R11,TPNT ;GET TORPEDO COUNT
01700 GO MINE3 ;CHECK MINE-TORPEDO COLISION
01800 MINE2: MOVEI R11,-1(SHIP) ;GET INDEX OF THIS MINE
01900 SUBI R11,NSHIP-1 ;LOOK AT MINE- LOWER MINES
02000 MINE3: SOJL R11,MINE4 ;ALL DONE WITH THESE OBJECTS
02100 HLRE W,@STTB2(R12) ;GET OBJECT POSITION -2Y
02200 HRRE X,@STTB2(R12) ;GET OBJECT POSITION +2X
02300 SUB W,B ;GET DY
02400 SUB X,C ;GET DX
02500 FSC W,223 ;FLOAT DIFFERENCE
02600 FSC X,223 ;FLOAT
02700 FMP W,W ;SQUARE
02800 FMP X,X ;SQUARE
02900 FAD W,X ;GET R↑2
03000 CAMLE W,MTCOLR ;COMPARE TO COLISION RADIUS
03100 GO MINE3 ;OK. LOOK FOR MORE
03200 DZM @STTB3(R12) ;ZERO A MINE OR TORP LIFE
03300 LAC C,SP(SHIP) ;GET MINE POSITION
03400 DZM SP(SHIP) ;MINE IS NOW GONE AWAY
03500 GO MINE5 ;MAKE IT FLASH
03600 MINE4: SOJE R12,MINE2 ;LOOK FOR MINE-MINE COLISIONS
03700 PUSHJ P,GRAV ;COMPUTE GRAVITY FOR MINE
03800 SKIPN C,SP(SHIP) ;GET POSITION
03900 GO MINE5 ;THIS IS A LOSER
04000 PUSHJ P,PLT1 ;MAKE IT A VECTOR
04100 SUB C,[BYTE(11)20,14] ;CENTER IT
04200 IORI C,6+VINVIS+VABS+VSIZ+4*VBRT ;INVIS, ABS, SIZE 1, BRT 4
04300 PUSH BFP,C ;SEND OUT VECTOR
04400 PUSH BFP,[<ASCII/*/>+1] ;SEND TEXT
04500 SOJA SHIP,MINE1 ;NEXT MINE
04600 MINE5: PUSHJ P,FLASH0 ;MAKE A FLASH
04700 SOJA SHIP,MINE1 ;LOOP
04800 MINE6: CAME R15,BFP ;ANY TEXT DONE THIS TIME?
04900 POPJ P, ;YES. RETURN
05000 SKIPGE MINSTR ;MINE RESTART SET?
05100 GO MINE7 ;YES: COUNT IT DOWN
05200 LAC R11,RSTARD ;GET RESTART DELAY
05300 MOVNM R11,MINSTR ;SET IT
05400 POPJ P, ;RETURN
05500 MINE7: AOSE MINSTR ;INCREMENT AND TEST IT
05600 POPJ P, ;RETURN
05700 ;FALL INTO MINE LAYING
05800
05900
06000
06100 LAYMIN: LAC R12,RANDX ;LAY THE MINES
06200 LAC W,NMINEX ;GET THE NUMBER OF MINES TO MAKE
06300 LAY1: SOJL W,CPOPJ ;DECREMENT COUNT. RETURN WHEN DONE
06400 ADD R12,RCONST ;LOAD THE RANDOM BASE
06500 DAC R12,RANDX ;GET A RANDOM NUMBER
06600 DAC R12,MINEP(W) ;SAVE AS THE MINE POSITION
06700 HRRE X,R12 ;GET 2X
06800 HLRE Y,R12 ;GET -2Y
06900 FSC X,223 ;FLOAT X
07000 FSC Y,223 ;FLOAT Y
07100 DAC X,MINEX(W) ;SAVE X POSITION
07200 MOVNM Y,MINEY(W) ;SAVE Y POSITION
07300 MOVN Y,Y ;GET +Y POSITION
07400 LAC D,X ;GET X
07500 FMP D,D ;X↑2
07600 LAC B,Y ;GET Y
07700 FMP B,B ;Y↑2
07800 FADB B,D ;R↑2
07900 PUSHJ P,SQRT ;GET R
08000 FMP B,D ;B ← R↑3
08100 LAC C,GG ;GRAV CONSTANT
08200 FDVM C,B ;B ← GG/R↑3
08300 PUSHJ P,SQRT ;GET SQRT(GG/R↑3)
08400 LAC C,B ;SQRT(GG/R) IN C AND B
08500 FMP C,X ;Y VELOCITY
08600 FMP B,Y ;X VELOCITY
08700 MOVNM C,MINEVY(W) ;SAVE -Y VELOCITY
08800 DAC B,MINEVX(W) ;SAVE +X VELOCITY
08900 FIX B,223000
09000 FIX C,223000
09100 HRL B,C ;GET Y VELOCITY INTO B
09200 DAC B,MINEV(W) ;SAVE THE MINE VELOCITY (FIXED POINT)
09300 TRNE R12,1000 ;TEST A RANDOM BIT
09400 GO LAY1 ;KEEP THIS VELOCITY SENSE
09500 MOVNS MINEV(W) ;NEGATE SENSE OF VELOCITIES
09600 MOVNS MINEVX(W) ;NEGATE SENSE OF VELOCITIES
09700 MOVNS MINEVY(W) ;NEGATE SENSE OF VELOCITIES
09800 GO LAY1 ;LOOP
09900 >
00100 SUBTTL LAUNCH A TORPEDO
00200
00300 CTORP: LAC W,TPNT ;GET COUNT OF ACTIVE TORPS
00400 LAC X,UTUBE(SHIP) ;GET THE TUBE NUMBER FOR THIS
00500 CAMGE W,TTBMAX ;IS THERE ROOM IN THE TABLE?
00600 SKIPL @RDELAY(X) ;YES: CHECK RELOAD DELAY
00700 POPJ P, ;TABLE FULL OR NOT RELOADED
00800 SOSLE W,TPCN(SHIP) ;DECREMENT TORPEDO COUNT
00900 GO TRLD ;LAUNCH IT
01000 LAC W,NSHIPX ;CHECK ALL OTHER SHIPS
01100 SKIPLE TPCN(W) ;ANY TORPS LEFT FOR THIS?
01200 POPJ P, ;SOMEBODY HAS TORPEDOES
01300 SOJGE W,.-2 ;LOOK FOR SOMEONE WITH TORPS
01400 LAC X,RSTARD ;USE RSTARD AS GAME RESET DELAY
01500 MOVNM X,QRSTRT ;ALL EMPTY: SET TO RESTART
01600 POPJ P, ;RETURN
01700
01800 TRLD: LAC W,TRELOD ;GET THE RELOAD TIME
01900 DAC W,@RDELAY(X) ;RESET DELAY ON THIS TUBE
02000 TRC X,1 ;SET UP THE OTHER TUBE NUMBER
02100 DAC X,UTUBE(SHIP) ;USE OTHER TUBE NEXT TIME
02200 LAC W,LATNCY ;LOAD THE LATENCY PERIOD
02300 CAML W,@RDELAY(X) ;SKIP IF EXISTING DELAY > LATENCY
02400 DAC W,@RDELAY(X) ;USE LATENCY AS MINIMUM
02500 LAC W,SR(SHIP) ;GET THE SHIP ORIENTATION
02600 HLRE X,TAB(W) ;GET THE COSINE
02700 MUL X,ITV ;MULTIPLY BY TORP VELOCITY
02800 HRRE W,TAB(W) ;GET THE SINE
02900 MUL W,ITV ;Y COMPONENT OF VELOCITY
03000 HLR Y,X ;RELATIVE VELOCITY OF TORP
03100 ADD Y,SV(SHIP) ;PLUS SHIP VELOCITY
03200 LAC W,TPNT ;GET NUMBER OF TORPS
03300 DAC Y,TV(W) ;SAVE THE ABSOLUTE TORP VELOCITY
03400 LAC X,STEMP(SHIP) ;GET THE SHIP NOSE POINT
03500 DAC X,TP(W) ;SAVE AS THE INITIAL TORP POSIT.
03600 LAC X,TLIFE ;GET THE LIFE
03700 HRL X,SHIP
03800 DAC X,TL(W) ;SHIP NUMBER,,LIFE TIME
03900 AOS TPNT ;COUNT A NEW TORPEDO
04000 TCOL: LAC X,TPNT ;DOES TORP EVER COLLIDE WITH ANOTHER?
04100 HRRE B,TV(W) ;ACTIVE TORPS IN X. GET THIS VELOCITY
04200 FSC B,223 ;FLOAT THIS NUMBER
04300 DAC B,TVX(W) ;SAVE X COMPONENT OF T. VELOCITY
04400 HLRE C,TV(W) ;GET -2Y VELOCITY
04500 FSC C,223 ;MAKE IT FLOAT
04600 DAC C,TVY(W) ;SAVE Y COMPONENT OF VELOCITY
04700 HRRE R11,TP(W) ;GET 2X POSITION
04800 FSC R11,223 ;FLOAT IT
04900 HLRE R12,TP(W) ;GET -2Y POSITION
05000 FSC R12,223 ;FLOAT IT
05100 HRLO R16,TL(W) ; TL,,-1 IN R16
05200 TCL1: SOJL X,TCBASH ;LOOK AT NEXT TORPEDO IN TABLE
05300 CAMN W,X ;IS THIS US?
05400 GO TCL1 ;YES: SKIP THE CALCULATION
05500 HRRE B,TP(X) ;GET THE 2X POSITION
05600 FSC B,223 ;FLOAT IT
05700 FSBM R11,B ;GET DELTA X IN B
05800 HLRE C,TP(X) ;GET -2Y POSITION
05900 FSC C,223 ;FLOAT IT
06000 FSB C,R12 ;FORM DELTA Y IN C
06100 LAC Y,TVX(W) ;Y ← VX1-VX2
06200 FSB Y,TVX(X) ;...
06300 MOVN R15,TVY(W) ;R15 ← VY1-VY2
06400 FAD R15,TVY(X) ;...
06500 LAC D,B ;D ←"B" =2((X1-X2)(VX1-VX2)+(Y1-Y2)(VY1-VY2))
06600 FMP D,Y
06700 LAC F,C
06800 FMP F,R15
06900 FAD D,F
07000
07100 FMP B,B ;B ← "C" = (X1-X2)↑2 + (Y1-Y2)↑2 - R↑2
07200 FMP C,C
07300 FAD B,C
07400 FSB B,TR2
07500 JUMPLE B,TBAM ;IMMEDIATE DISINTEGRATION OF TORPS
07600
07700 FMP Y,Y ;Y ← "A" = (VX1-VX2)↑2 + (VY1-VY2)↑2
07800 FMP R15,R15
07900 FAD Y,R15
08000 JUMPE Y,TCL1
08100 FMP B,Y ;B = "B"↑2 - 4*"A"*"C"
08200 LAC C,D
08300 FMP C,C
08400 FSBM C,B
08500 JUMPLE B,TCL1 ;DISCRIMINANANT IS < 0, SO NO COLLISION.
08600
08700 PUSHJ P,SQRT ;FINISH QUADRATIC FORMULA.
08800 MOVN D,D ;B ← -"B"-SQRT(DISC.)
08900 FSBM D,B
09000 FDV B,Y
09100 MULI B,400 ;FIX RELATIVE TIME OF COLLISION.
09200 ASH C,-243(B)
09300 JUMPL C,TCL1 ;IF NEG TIME
09400 JUMPE C,TBAM ;INSTANT EXPLOSION
09500 CAR B,TL(W) ;GET LIFTIME
09600 CAR D,TL(X) ;GET LIFTIME
09700 CAMG C,D ;WILL BOTH TORPS BE ALIVE THEN?
09800 CAMLE C,B ;NOPE: FORGET IT
09900 GO TCL1 ;NO COLISION
10000 HRL C,C
10100 HRR C,X
10200 CAMG C,R16 ;IS THIS COLLISION SOONER THAN OUR SOONEST?
10300 LAC R16,C ;YES
10400 GO TCL1 ;LOOP
10500 TCBASH: HLRM R16,TL(W) ;SAVE THE EXPECTED LIFE
10600 TRNN R16,700000 ;R16 CONTAINS THE GUY WE COLIDE WITH
10700 HLRM R16,TL(R16) ;SO SAVE THIS AS HIS TL
10800 POPJ P,
10900
11000 TBAM: DZM TL(W) ;MAKE BOTH TORPS. GO AWAY.
11100 DZM TL(X)
11200 POPJ P,
00100 SUBTTL XDRAW AND DRAW
00200
00300 XDRAW: SKIPE R12,ZOWSW(SHIP) ;IS THIS GUY GONE?
00400 GO ZORCH ;YES.
00500 SKIPG R12,HYPER(SHIP) ;IS THIS SHIP IN HYPERSPACE?
00600 GO XDRAW2 ;NO. DRAW IT
00700 IFN NHYP,<
00800 CAILE R12,60 ;TIME FOR THE STAR OF THE EAST?
00900 POPJ P, ;NOPE
01000 LAC C,SP(SHIP) ;GET CENTER OF SHIP
01100 PUSHJ P,PLT1 ;MAKE LVW
01200 IORI C,6+7*VBRT+VENDP+VABS ;BRIGHT ENDPOINT ABSOLUTE
01300 PUSH BFP,C ;STUFF IN BUFFER
01400 PUSH BFP,C ;SECOND TIME FOR A VERY BRIGHT STAR
01500 >
01600 POPJ P, ;RETURN
01700 XDRAW2: LAC R12,UTUBE(SHIP) ;GET THE NEXT TUBE TO USE
01800 SKIPGE @RDELAY(R12) ;SKIP IF TUBE IS UNREADY
01900 SKIPGE TPCN(SHIP) ;TUBE READY. ANY TORPS LEFT?
02000 GO DRAW ;NOT READY OR EMPTY
02100 LAC R12,TPNT ;GET ACTIVE COUNT
02200 CAML R12,TTBMAX ;LESS THAN MAX
02300 GO DRAW ;NO: GUN IS JAMMED
02400 LAC C,SP(SHIP) ;GET SHIP CENTER
02500 PUSHJ P,PLT1 ;MAKE LVW
02600 IORI C,6+7*VBRT+VABS+VENDP ;DISPLAY RELOAD LITE
02700 PUSH BFP,C ;STUFF IN THE BUFFER
02800 PUSH BFP,C ;SECOND TIME FOR VERY BRIGHT
02900 DRAW: LAC C,R16 ;GET SHIP NOSE POSITION
03000 PUSHJ P,PLT1 ;MAKE LVW
03100 IORI C,34146 ;INVISIBLE, ABSOLUTE, BRITE
03200 PUSH BFP,C ;STUFF THE LVW
03300 L2: SKIPN R12,(R14) ;R14 POINTS TO SHIP TABLE
03400 POPJ P, ;NO MORE SHIP TABLE
03500 HLRE F,R12 ;GET THE STEP COUNT
03600 ADD R12,R15 ;ADD THE ORIENTATION
03700 ANDI R12,177 ;MAKE IT AN INDEX
03800 LLL: ADD R16,TAB(R12) ;ADD ORIENTATION TO POSITION
03900 LAC C,R16 ;LOAD NEW POINT
04000 PUSHJ P,PLT1 ;MAKE LVW
04100 IORI C,14126 ;TURN ON ENDPOINT, BRITE
04200 PUSH BFP,C ;STUFF IT
04300 AOJL F,LLL ;LOOP UNTIL NO MORE STEPS
04400 AOJA R14,L2 ;GET NEXT PART OF SHIP TABLE
04500 PLT1: LDB B,[POINT 10,C,27] ;GET BITS 18-27: X POSITION
04600 ASH C,-1 ;SHIFT -2Y TO -Y
04700 SETCM C,C ;ONES COMPLEMENT: MAKE +Y
04800 LSHC B,-12 ;SHIFT X INTO C
04900 ASH C,-1 ;ONE MORE PLACE FOR 11 BIT FIELD
05000 TRZ C,37777 ;SHUT OF ALL BUT X,Y BITS
05100 POPJ P, ;AND RETURN
05200 ZORCH: SKIPLE ZORCHP(SHIP) ;IS THIS FIRST TIME THRU?
05300 GO ZORCH1 ;NOPE,
05400 PUSHJ P,FLASH ;FIRST TIME: MAKE A FLASH
05500 LAC R14,RCONST
05600 ADDB R14,RANDX ;MAKE A NEW RANDOM NUMBER
05700 DAC R14,HYPCNT(SHIP) ;HYPCNT ISN'T NEEDED ANYMORE.
05800 ZORCH1: AOS R14,ZORCHP(SHIP) ;COUNT TIMES THRU
05900 SKIPL ZOWSW(SHIP) ;QUICK RETURN FOR FALL IN THE SUN
06000 CAIL R14,60 ;IS THIS ENOUGH?
06100 POPJ P, ;RETURN
06200 LSH R14,-3 ;DIVIDE BY 32
06300 SUBI R14,13 ;14 IS MAX NUMBER OF FRAGS
06400 LAC R12,[POINT 3,HYPCNT(SHIP)] ;POINTER TO A DOZEN VELOCITIES
06500 LAC R11,[POINT 7,HYPCNT(SHIP),6] ;POINTER THAT SLIDES
06600 ZORCH2: ILDB B,R12 ;GET A VELOCITY
06700 IMUL B,ZORCHP(SHIP) ;TIMES THE TIME
06800 ASH B,-2 ;SCALE IT DOWN
06900 LDB C,R11 ;GET A DIRECTION
07000 ADD C,R15 ;ADD IN BASE DIRECTION
07100 ANDI C,177 ;MAKE INDEX TO TAB
07200 MUL B,TAB(C) ;MULTIPLY BY FRAGMENT DIRECTION
07300 SUB R11,[XWD 20000,0] ;SLIDE THE DIRECTION OVER TWO BITS
07400 ADD C,R16 ;ADD IN THE BASIC POSITION
07500 PUSHJ P,PLT1 ;MAKE LVW
07600 LAC B,RCONST ;GET A RANDOM NUMBER
07700 ADDB B,RANDX ;FOR THE BRIGHTNESS
07800 ANDI B,7*VBRT ;AND OUT ALL BUT BRT
07900 IORI C,6+VABS+VENDP(B) ;OR THE MAJIC BITS
08000 PUSH BFP,C ;STUFF IT
08100 TRNE B,VBRT
08200 PUSH BFP,C
08300 AOJLE R14,ZORCH2 ;LOOP FOR EACH PARTICLE
08400 POPJ P, ;RETURN
08500 FLASH: LAC C,R16 ;MAKE A FLASH. GET OBJECT POSITION
08600 FLASH0: PUSHJ P,PLT1 ;MAKE LVW
08700 IORI C,6+7*VBRT+VABS+VINVIS+2*VSIZ
08800 FLASHX: MOVEI B,FLASHL-1 ;GET TABLE SIZE
08900 FLASH1: PUSH BFP,C ;STUFF VECTOR
09000 PUSH BFP,FLASHT(B) ;STUFF CHARACTER
09100 SOJGE B,FLASH1 ;LOOP
09200 POPJ P, ;RETURN
09300 FLASHT: <ASCII /*/>+1 ;TABLE OF CHARACTERS
09400 <ASCII /W/>+1
09500 <ASCII /#/>+1
09600 <ASCII /@/>+1
09700 <ASCII /*/>+1
09800 SDEF(FLASHL,.-FLASHT) ;FLASH TABLE LENGTH
00100 SUBTTL SIN, COS AND SQRT
00200 COS: FSB A,[4.712389]
00300 SIN: MOVNI F,10
00400 LAC Y,[1.0]
00500 LAC C,[1.0]
00600 JFCL 10,.+1
00700 LAC W,A
00800 MOVN D,A
00900 FMP D,A
01000 L1: FAD Y,[1.0]
01100 FMP C,Y
01200 FAD Y,[1.0]
01300 FMP C,Y
01400 FMP W,D
01500 LAC X,W
01600 FDV X,C
01700 JFCL 10,CPOPJ
01800 FAD A,X
01900 AOJL F,L1
02000 POPJ P,
02100
02200 SQRT: ASHC B,-33
02300 SUBI B,201
02400 ROT B,-1
02500 PUSH P,B
02600 LSH B,-43
02700 ASH C,-10
02800 FSC C,177(B)
02900 DAC C,1(P) ;WATCH OUT FOR THE BUM WHO WROTE THIS
03000 FMP C,SQ1(B)
03100 FAD C,SQ2(B)
03200 LAC B,1(P)
03300 FDV B,C
03400 FAD C,B
03500 FSC C,-1
03600 LAC B,1(P)
03700 FDV B,C
03800 FADR B,C
03900 POP P,C
04000 FSC B,(C)
04100 POPJ P,
04200 SQ1: 0.8125 ;CONSTANTS FOR SQRT ROUTINE
04300 0.578125
04400 SQ2: 0.302734
04500 0.421875
00100 SUBTTL GRAV: CALCULATE SHIP POSITION
00200 GRAV: CAILE SHIP,NSHIP-1 ;SKIP IF A SHIP
00300 GO GRAV1 ;IS A MINE
00400 SKIPGE ZOWSW(SHIP) ;LOOK AT SHIP'S ZOWSW
00500 POPJ P, ;DID COLLIDE WITH THE SUN
00600 GRAV1: LAC B,SX(SHIP) ;GET X POSITION
00700 LAC C,SY(SHIP) ;GET Y POSITION
00800 FMP B,B ;X↑2
00900 FMP C,C ;Y↑2
01000 FAD B,C ;R↑2
01100 MOVN X,B ;X ← -R↑2
01200 PUSHJ P,SQRT ;GET R
01300 CAMG B,SCR ;ARE WE TOO CLOSE TO THE SUN?
01400 GO ZOWIE1 ;YES: MAKE OBJECT DISAPPEAR
01500 FMP B,X ;B ← -R↑3
01600 LAC C,GG ;GET GRAVITY CONSTANT IN C
01700 FDVB C,B ;-GG/R↑3 IN C AND B
01800 FMP B,SX(SHIP) ;-GG*X/R↑3 IN B = X ACCELERATION
01900 FMP C,SY(SHIP) ;-GG*Y/R↑3 IN C = Y ACCELERATION
02000 CAIG SHIP,NSHIP-1 ;IS THIS A MINE?
02100 SKIPN STX(SHIP) ;IS HE THRUSTING?
02200 GO GINT ;NO THRUST FROM A SHIP, OR A MINE
02300 LAC D,SR(SHIP) ;GET THE SHIP ORIENTATION
02400 HRRE W,TAB(D) ;GET THE -COS
02500 FSC W,206 ;FLOAT IT
02600 FMP W,STX(SHIP) ;MULTIPLY WITH THE THRUST
02700 FAD B,W ;ADD THIS TO THE X ACCELERATION
02800 HLRE W,TAB(D) ;GET THE SIN
02900 FSC W,206 ;FLOAT IT
03000
03100 FMP W,STX(SHIP) ;MULTIPLY BY THE THRUST
03200 FSB C,W ;SUBTRACT FROM THE Y ACCELERATION
03300
03400 GINT: FMP B,GDT ;MULTIPLY ACCELERATION BY DELTA T
03500 FMP C,GDT ;THE PRODUCT IS DELTA VELOCITY
03600 FADB B,SVX(SHIP) ;ADD DELTA TO EXISTING VELOCITY
03700 FADB C,SVY(SHIP) ;...
03800 FMP B,GDT ;TAKE VELOCITY*DELTA T
03900 FMP C,GDT ;FORMS A DELTA X AND Y
04000 LAC W,C ;DELTA Y IN W
04100 MULI W,400
04200 TSC W,W
04300 ASH X,-211(W)
04400 MOVNM X,SV(SHIP) ;SAVE -2Y IN SHIP VELOCITY
04500 LAC W,B ;GET DELTA X INTO W
04600 MULI W,400 ;FIX IT
04700 TSC W,W
04800 ASH X,-211(W)
04900 HLRM X,SV(SHIP) ;-2*DELTA Y,,2*DELTA X IN SV
05000 FAD B,SX(SHIP) ;ADD THE POSITION
05100 FAD C,SY(SHIP) ;...
05200 CAML B,[511.0] ;CHECK THE POSITION ON THE SCREEN
05300 FSB B,[1024.0]
05400 CAMG B,[-512.0]
05500 FAD B,[1024.0]
05600 CAML C,[511.0]
05700 FSB C,[1024.0]
05800 CAMG C,[-512.0]
05900 FAD C,[1024.0]
06000 DAC B,SX(SHIP)
06100 DAC C,SY(SHIP) ;SAVE (REVISED) POSITIONS
06200
06300 MULI C,400 ;FIX THE POSITIONS
06400 TSC C,C
06500 ASH D,-211(C)
06600 MOVNM D,SP(SHIP)
06700 MULI B,400
06800 TSC B,B
06900 ASH C,-211(B)
07000 HLRM C,SP(SHIP) ;SAVE FIXED POSITIONS IN SP
07100 POPJ P,
00100 SUBTTL SHIP - TORPEDO AND SHIP - MINE COLISION
00200 STCOL: SKIPE ZOWSW(SHIP) ;THIS SHIP DEAD?
00300 POPJ P, ;YES, CAN'T COLLIDE WITH ANYTHING
00400 LAC W,SR(SHIP) ;GET SHIP ORIENTATION
00500 MOVN X,TAB(W) ;GET --COS
00600 HRLZ Y,TAB(W) ;AND +SIN
00700 MOVN W,SP(SHIP) ;GET --Y POS.
00800 HRLZ D,SP(SHIP) ;AND X POS.
00900 MOVEI R12,1 ;1 FOR TORPS, 0 FOR MINES
01000 STL0: LAC R11,@STTB1(R12) ;GET TPNT OR NMINEX
01100 STL1: SOJL R11,STL2 ;ALL DONE WITH TORPS-DO MINES
01200 LAC B,@STTB2(R12) ;GET POS. OF TORP (OR MINE)
01300 JUMPE B,STL1 ;EXPIRED MINE
01400 LAC F,R12 ;WE MAY INTERPOLATE IF F > 0
01500 STL1.1: MOVN C,B ;LOAD C WITH 2Y POSITION OF TORP
01600 MOVS B,B ;SWAP B. X POSITION OF OBJECT
01700 SUB B,D ;GET DELTA X FROM TORP TO SHIP
01800 CAMG B,[25B9] ;IS IT EVEN CLOSE?
01900 CAMGE B,[-25B9] ;....
02000 GO STL1 ;NO
02100 SUB C,W ;GET DELTA Y
02200 CAMG C,[25B9] ;IS IT CLOSE?
02300 CAMGE C,[-25B9] ;.....
02400 GO STL1 ;NO
02500 LAC R14,B ;R14 ← DELTA X
02600 MUL R14,X ;GET dx cos (phi)
02700 LAC R15,C ;R15 ← DELTA Y
02800 MUL R15,Y ;GET dY sin(phi)
02900 SUB R14,R15 ;x' = dx cos(phi)-dy sin(phi)
03000 DAC R14,SAVSID ;REMEMBER SIDE WERE ON
03100 MOVM R14,R14 ;GET ABS(X'). (SHIP IS SYMMETRIC)
03200 CAML R14,[13B17] ;IN BOUNDS?
03300 GO STINTR ;NOPE: SEE ABOUT INTERPOLATING
03400 LAC R15,C ;NOW ROTATE DY INTO SHIP COORDINATES
03500 MUL R15,X ;DY COS(PHI)
03600 MUL B,Y ;DX SIN(PHI)
03700 ADD R15,B ;Y' = DXSIN(PHI)+DY COS(PHI)
03800 CAMG R15,[25B17] ;Y VALUE IN BOUNDS?
03900 CAMGE R15,[-27B17] ;...
04000 GO STINTR ;NOPE: SEE ABOUT INTERPOLATION
04100 CAML R15,[-12B17] ;SKIP IF TORP IN WIDE TAIL
04200 CAMG R14,[4B17] ;SKIP UNLESS TORP IN NARROW BODY
04300 GO STX2 ;WE HAVE A COLISION
04400 STINTR: SOJL F,STL1 ;NO INTERPOLATION: SECOND TRY OR MINES
04500 MOVN B,TV(R11) ;GET -(THE TORPEDO VELOCITY)
04600 HRRE C,B ;GET RIGHT SIDE
04700 ASH B,-1 ;HALVE LEFT OF B
04800 ASH C,-1 ;HALVE RIGHT OF C
04900 HRR B,C ;RELOAD B WITH HALF OF RIGHT SIDE
05000 ADD B,TP(R11) ;ADD TO TORPEDO POSITION
05100 GO STL1.1 ;B CONTAINS INTERPOLATED POSITION
05200 STL2: SOJGE R12,STL0 ;AFTER TORPS, DO MINES, THEN
05300 POPJ P, ;RETURN
05400 STX2: SKIPE DAMHIT ;PARTIAL DAMAGE ALLOWED?
05500 CAMG R14,[4B17] ;DIRECT HIT?
05600 GO STX3 ;NO PARTIAL DAMAGE OR KILLED DEAD
05700 DZM @STTB3(R12) ;KILL OBJECT
05800 SKIPL SAVSID ;CHECK SIDE
05900 SKIPA R14,ROTLBT(SHIP) ;HIT RIGHT
06000 LAC R14,ROTRBT(SHIP) ;HIT LEFT
06100 TDOE R14,DMASK ;SET BIT IN THE DAMAGE LIST
06200 GO STX3 ;KILL GUY
06300 IORM R14,DMASK ;SET BIT IN DAMAGE LIST
06400 LAC C,@STTB2(R12) ;GET WHERE
06500 PUSHJ P,PLT1 ;LVW
06600 IORI C,7*VBRT+VSIZ+VINVIS+VABS+6;
06700 GO FLASHX ;FLASH & RETURN
06800
06900 STX3: ZAC R14,
07000 EXCH R14,@STTB3(R12)
07100 MOVEI F,2(R12) ;ZERO OBJECT. SET XPLOSION TYPE
07200 DAC F,ZOWSW(SHIP) ;SAVE EXPLOSION TYPE
07300 JUMPE R12,QRST0 ;JUMP IF SHIP-MINE
07400 LAC R11,KILLBN ;KILLER'S REWARD
07500 CDR R14,R14 ;GET THE NAME OF THE KILLER IN R14
07600 SKIPE KILLER
07700 ADDM R11,NUMWN(R14) ;INCREASE HIS SCORE
07800 GO QRST1 ;GO THINK ABOUT RESTARTING
07900 ZOWIE1: DZM SP(SHIP) ;ZERO POSITION MEANS DIED IN SUN
08000 CAIG SHIP,NSHIP-1 ;SKIP IF A MINE
08100 SKIPE ZOWSW(SHIP) ;SKIP IF SHIP WAS ALIVE
08200 POPJ P, ;MINE- SUN COLISION
08300 SKIPN KILSUN ;DO WE HAVE KILLER SUN?
08400 GO ZOWMAP ;AND, IT'S ONLY OUR PAPER SUN
08500 SETOM ZOWSW(SHIP) ;SIGNIFIES DEATH BY THE SUN
08600 QRST0: AOS GALAXY ;COUNT ONE FOR GALACTIC OVERHEAD
08700 QRST1: LAC R14,RSTARD ;LOAD RESTART DELAY
08800 MOVNM R14,RESTAR(SHIP) ;SAVE IT
08900 MOVN R14,DIEPEN ;PENALTY FOR DYING
09000 ADDM R14,NUMWN(SHIP) ;UPDATE SCORE
09100 PUSHJ P,CNT4 ;DISPLAY SCORE
09200 SKIPE DOTEAM ;ARE WE DOING TEAM SCORES?
09300 GO QRST2 ;YES COMPUTE IF ONE TEAM WIPED OUT
09400 LAC R14,NSHIPX ;ARE THERE ANY LEFT?
09500 SETO F, ;COUNT NUMBER LEFT
09600 SKIPN ZOWSW(R14) ;IS THIS STILL HERE
09700 ADDI F,1 ;YES: COUNT IT
09800 SOJGE R14,.-2 ;LOOP
09900 JUMPG F,CPOPJ ;JUMP IF >1 LEFT
10000 GO QRST3 ;OK. SET THE RESTART TIME
10100 QRST2: LAC R14,NSHIPX ;LOOK AT ALL SHIPS
10200 QRST2A: SUBI R14,1 ;DECREMENT
10300 SKIPE ZOWSW(R14) ;SKIP IF STILL ALIVE
10400 SKIPN ZOWSW+1(R14) ;DEAD. SKIP IF TEAMMATE LIVES
10500 SOJGE R14,QRST2A ;ONE TEAM IS PARTIALLY LIVE
10600 JUMPL R14,CPOPJ ;RETURN IF BOTH TEAMS THERE
10700 QRST3: LAC F,TLIFE ;TIME TO RESTART
10800 MOVNM F,QRSTRT ;SET RESTART TIME
10900 POPJ P, ;RETURN
11000
11100 ZOWMAP: LAC F,[XWD 377777,377777]
11200 DAC F,SP(SHIP)
11300 MOVEI F,377777
11400 FSC F,223
11500 DAC F,SX(SHIP)
11600 DAC F,SY(SHIP)
11700 POPJ P,
00100 JS: DZM JSTB ;ZERO TABLE BEGINNING
00200 LAC B,[XWD JSTB,JSTB+1] ;LOAD BLT POINTER
00300 BLT B,JSTBX ;RUN THRU TABLE WITH ZEROES
00400 TDZ A,DMASK ;ASSESS DAMAGES
00500 LAC F,BTX ;GET STANDARD THRUST
00600 LAC B,BRX ;GET STANDARD ROTATION
00700 LAC C,HYTIME ;STANDARD HYPERSPACE DURATION
00800 LAC SHIP,NSHIPX ;FOR THIS MANY SHIPS
00900 BITLOP: TDNE A,THRUBT(SHIP) ;IS HE THRUSTING?
01000 DAC F,STX(SHIP) ;YES. GIVE HIM SOME
01100 TDNE A,ROTRBT(SHIP) ;ROTATING RIGHT?
01200 DAC B,SRX(SHIP) ;YES
01300 TDNE A,ROTLBT(SHIP) ;ROTATING LEFT?
01400 MOVNM B,SRX(SHIP) ;YES GIVE HIM NEGATIVE
01500 TDC A,HYPRBT(SHIP) ;SET-UP FOR HYPER TEST
01600 TDCE A,HYPRBT(SHIP) ;IS HE HYPER SPACING?
01700 GO JS1 ;NO
01800 DZM SRX(SHIP) ;DON'T LET HIM ROTATE BOTH WAYS
01900 SKIPN HYPON
02000 GO JS1 ;HYPERSPACE OFF
02100 IFN HYPERS,< ;ORIGINAL HYPERSPACE?
02200 DAC C,HYPER(SHIP) ;SET HIS HYPER TIME
02300 >
02400 IFN NHYP,< ;NEW HYPERSPACE?
02500 PUSHJ P,SETHYP ;SET UP FOR HYPERSPACE
02600 >
02700 JS1: SOJGE SHIP,BITLOP ;LOOP FOR EVERY SHIP
02800 POPJ P, ;ALL DONE
00100 SUBTTL INSERT LOSER INTO NEW HYPERSPACE
00200 IFN NHYP,<
00300 SETHYP: LAC C,RCONST
00400 ADDB C,RANDX
00500 DAC C,SP(SHIP)
00600 HLRE B,C ;GET -2Y
00700 HRRE C,C ;GET 2X
00800 FSC B,223 ;FLOAT IT
00900 FSC C,223 ;FLOAT Y
01000 DAC C,SX(SHIP) ;SAVE X
01100 MOVNM B,SY(SHIP) ;SAVE Y
01200 DZM SV(SHIP) ;NO VELOCITY FOR SHIP
01300 DZM SVX(SHIP)
01400 DZM SVY(SHIP)
01500 LAC C,RANDX ;GET RANDOM NUMBER
01600 LAC B,C ;IN BOTH
01700 ANDI B,177 ;GIVE HIM A RANDOM ORIENTATION
01800 DAC B,SR(SHIP) ;...
01900 ADDI B,100 ;MAKE SURE HE STAYS OUT A WHILE
02000 DAC B,HYPER(SHIP) ;SAVE TIME TO SPEND THERE
02100 LSH C,-5 ;TAKE A RANDOM FIELD
02200 ANDI C,3 ;AND WITH 7
02300 AOS B,HYPCNT(SHIP) ;INCREMENT HIS TIMES IN H SPACE
02400 CAMGE C,B ;SKIP IF HE WILL SURVIVE
02500 SETOM HYPCNT(SHIP) ;HE SHALL LOSE
02600 POPJ P, ;HE WINS THIS TIME
02700 >
00100 SUBTTL CODE FOR RUNTIME PARAMETER MODIFICATION
00200 IFG PARM,<
00300 SDEF(DIGF,1)
00400 SDEF(LETF,2)
00500 SDEF(NEGF,4)
00600 SDEF(CNGF,10)
00700 SDEF(PNTF,20)
00800 LPARM: 0 ;CELL TO REMEMBER WHERE
00900 RPARM: SETO A, ;GET OUR LINE CHARACTERISTICS
01000 TTCALL 6,A ;INTO A
01100 TLO A,100 ;SET SPECIAL ACTIVATION MODE
01200 TTCALL 7,A ;TTY WILL WAKE ON WORD BY WORD
01300 TTCALL 14, ;WAIT FOR A WORD TO COME IN
01400 SETO A, ;FOR OUR LINE
01500 TTCALL 6,A ;GET LINE CHARACTERISTICS
01600 TLZ A,100 ;SHUT OFF SPECIAL BIT
01700 TTCALL 7,A ;RESET LINE MODE
01800 PUSHJ P,GETNAM ;GET THE NAME OF A CELL
01900 CAIE A,"/" ;/ IS THE ACTIVATOR
02000 GO QWERT ;LOSE
02100 CAIE B,45 ;CODE FOR .?
02200 GO RPARM0 ;NOPE
02300 SKIPN D,LPARM
02400 GO QWERT
02500 GO RPARM2 ;WE HAVE IT
02600 RPARM0: CAMN B,[RADIX50 0,LIST] ;COMMAND TO LIST?
02700 GO RPARML ;YE
02800 CAMN B,[RADIX50 0,CLEAR] ;CLEAR SCREEN?
02900 GO RPMC ;YES
03000 MOVEI D,PTAB ;GET ADDRESS OF TABLE
03100 RPARM1: LAC C,(D) ;GET SYMBOL CELL FROM TABLE
03200 TLZ C,740000 ;SHUT OFF CODE BITS
03300 CAMN B,C ;MATCH?
03400 GO RPARM2 ;YES!
03500 ADDI D,2 ;PRESS AHEAD
03600 CAIGE D,PTABX ;END OF TABLE?
03700 GO RPARM1 ;NO. LOOP.
03800 QWERT: TTCALL 11,0 ;I DON'T UNDERSTAND
03900 TTCALL 3,[ASCIZ/?
04000 /]
04100 POPJ P, ;GIVE UP
04200 RPARM2: CAR A,1(D) ;LOAD ADDRESS OF PARAMETER
04300 DAC D,LPARM ;REMEMBER .
04400 LAC A,(A) ;GET WHOLE PARAMETER
04500 LDB B,[POINT 3,0(D),3] ;GET CODE BITS
04600 TTCALL 3,[ASCIZ/ /] ;WRITE TAB
04700 CAR C,IOTAB(B)
04800 PUSHJ P,(C)
04900 TTCALL 3,[ASCIZ/ /] ;AND A TAB
05000 CDR C,IOTAB(B)
05100 PUSHJ P,(C)
05200 GO QWERT
05300 TRNN F,CNGF
05400 POPJ P, ;NO CHANGE
05500 CDR B,1(D)
05600 JUMPE B,RPARM4 ;READY TO STUFF
05700 LAC C,(D)
05800 TLNE C,400000
05900 GO RPARM3 ;TEST FOR LOWER BOUND
06000 CAML B,W
06100 GO RPARM4
06200 RPARMX: TTCALL 3,[ASCIZ/OUT OF BOUNDS
06300 /]
06400 POPJ P,
06500 RPARM3: CAMLE B,W
06600 GO RPARMX
06700 RPARM4: CAR C,1(D)
06800 DAC W,(C)
06900 POPJ P,
07000 RPARML: MOVEI D,PTAB
07100 TTCALL 3,[ASCIZ/
07200 /]
07300 RPML1: LAC W,(D) ;GET RADIX 50
07400 TLZ W,740000
07500 PUSHJ P,R5OUT ;WRITE RADIX50
07600 LDB B,[POINT 3,0(D),3] ;GET BITS
07700 TTCALL 3,[ASCIZ/ /]
07800 CAR A,1(D)
07900 LAC A,(A)
08000 CAR C,IOTAB(B)
08100 PUSHJ P,(C)
08200 TTCALL 3,[ASCIZ/
08300 /]
08400 ADDI D,2
08500 CAIGE D,PTABX
08600 GO RPML1
08700 POPJ P,
08800 R5OUT: IDIVI W,50
08900 HRLM X,(P)
09000 JUMPE W,.+2
09100 PUSHJ P,R5OUT
09200 CDR W,(P)
09300 JUMPG W,R5OUT1
09400 TTCALL 3,[ASCIZ/ /]
09500 POPJ P,
09600 R5OUT1: CAILE W,12
09700 GO R5OUT2
09800 ADDI W,"0"-1
09900 TTCALL 1,W
10000 POPJ P,
10100 R5OUT2: CAILE W,44
10200 GO R5OUT3
10300 ADDI W,"A"-13
10400 TTCALL 1,W
10500 POPJ P,
10600 R5OUT3: SUBI W,2
10700 CAIN A,43
10800 MOVEI W,"."
10900 TTCALL 1,W
11000 POPJ P,
11100 RPMC: TTCALL 3,[BYTE(7)15,14,14,14]
11200 POPJ P,
00100 GETNAM: ZAC B, ;ZERO B. WE ACCUMULATE RADIX 50
00200 GETNM1: PUSHJ P,GETLET ;GET A LETTER AND SKIP
00300 POPJ P, ;B WILL CONTAIN THE NAME. A HAS BREAK
00400 PUSHJ P,R50 ;A IS CONVERTED TO RADIX 50
00500 IMULI B,50 ;MAKING RADIX 50
00600 ADD B,A ;ADD IN CHARACTER
00700 GO GETNM1 ;LOOP
00800 GETCHR: TTCALL 0,A ;GET A CHARACTER
00900 TRZ F,LETF+DIGF ;ZERO FLAGS
01000 CAIL A,"a" ;SKIP IF NOT LOWER CASE
01100 CAILE A,"z" ;SKIP IF LOWER CASE
01200 GO GETCH1 ;LOOK FOR MORE
01300 TRZ A,40 ;MAKE UPPER CASE
01400 GO GETCH2 ;GO TURN ON LETF AND RETURN
01500 GETCH1: CAIL A,"A" ;SKIP IF NOT LETTER
01600 CAILE A,"Z" ;SKIP IF LETTER
01700 GO GETCH3 ;TEST FOR DIGITS
01800 GETCH2: TRO F,LETF ;TURN ON FLAG
01900 POPJ P, ;RETURN
02000 GETCH3: CAIL A,"0" ;SKIP IF NOT DIGIT
02100 CAILE A,"9" ;SKIP IF DIGIT
02200 GO GETCH4 ;NOT DIGIT
02300 TRO F,DIGF ;SET FLAG
02400 POPJ P, ;RETURN
02500 GETCH4: CAIN A,15 ;IS IT CR?
02600 GO GETCHR ;YES. GET NEXT
02700 CAIN A,175 ;TEST FOR ALTMODE
02800 MOVEI A,12 ;CONVERT TO LF
02900 POPJ P, ;RETURN
03000 GETLET: PUSHJ P,GETCHR ;GET A LETTER. FIRST GET CHARACTER
03100 TRNE F,LETF+DIGF ;ANY FLAGS SET?
03200 GO CPOPJ1 ;YES: DO A SKIP RETURN
03300 CAIE A,"$"
03400 CAIN A,"%"
03500 GO CPOPJ1
03600 CAIN A,"."
03700 CPOPJ1: AOS (P)
03800 POPJ P,
03900 R50: TRNE F,LETF ;IS THIS A LETTER
04000 SUBI A,"A"-13 ;CONVERT TO R 50
04100 TRNE F,DIGF ;IS IT A DIGIT
04200 SUBI A,"0"-1
04300 TRNE F,LETF+DIGF
04400 POPJ P,
04500 ADDI A,2
04600 CAIN A,"."+2
04700 MOVEI A,45
04800 POPJ P,
04900 DECOUT: LAC W,A ;GET ARGUMENT
05000 MOVEI Y,12 ;GET RADIX
05100 GO ALLRAD ;DO FOR ALL RADIX
05200 OCTOUT: LAC W,A ;GET ARGUMENT
05300 MOVEI Y,10 ;SET RADIX
05400 GO ALLRAD ;DO ALL
05500 OHOUT: CDR W,A ;GET FIRST HALF
05600 MOVEI Y,10 ;SET RADIX
05700 PUSHJ P,ALLRAD ;DO FIRST HALF
05800 TTCALL 3,[ASCIZ/,,/] ;WRITE SEPARATION
05900 CAR W,A ;GET OTHER SIDE
06000 ALLRAD: JUMPGE W,ARADIX
06100 TTCALL 3,[ASCIZ/-/]
06200 MOVN W,W
06300 ARADIX: IDIV W,Y
06400 HRLM X,(P)
06500 JUMPE W,.+2
06600 PUSHJ P,ARADIX
06700 CDR W,(P)
06800 ADDI W,"0"
06900 TTCALL 1,W
07000 POPJ P,
07100 FLOUT: JUMPN A,FLOUT1 ;JUMP UNLESS ARGUMENT IS 0
07200 TTCALL 3,[ASCIZ/0.0/]
07300 POPJ P,
07400 FLOUT1: MOVM W,A ;GET |ARG| INTO W
07500 JUMPG A,FLOUT2 ;JUMP PAST KLUGE IF ARG POSITIVE
07600 TTCALL 3,[ASCIZ/-/]
07700 FLOUT2: ZAC Y, ;POSITION OF THE POINT
07800 FLOUT3: CAML W,[1.0] ;LESS THAN 1.0
07900 GO FLOUT4 ;NO
08000 FMPR W,[10.0] ;MULTIPLY BY 10.0
08100 SOJA Y,FLOUT3 ;COUNT THE POINT SHIFT
08200 FLOUT4: CAMGE W,[10.0] ;COMPARE TO 10.0
08300 GO FLOUT5 ;WE ARE SCALED
08400 FDVR W,[10.0] ;SCALE DOWN
08500 AOJA Y,FLOUT3 ;COUNT AND LOOP
08600 FLOUT5: CAML Y,[-2] ;ARE WE IN BOUNDS?
08700 CAILE Y,6 ;IN BOUNDS?
08800 GO FLOUTE ;NO: WRITE IN EXPONENT FORM
08900 AOJG Y,FLOUTX ;PREPARE FOR BIG NUMBER
09000 TTCALL 3,[ASCIZ/0./] ;WRITE BEGINNING OF NUMBER
09100 JUMPE Y,FLOUTX ;JUMP IF NO MORE 0'S
09200 TTCALL 3,[ASCIZ/0/] ;WRITE PLACE HOLDER ZEROES
09300 AOJL Y,.-1 ;LOOP
09400 FLOUTX: FMPR W,[1000000.0] ;MULTIPLY BY BIG NUMBER
09500 MULI W,400 ;SPLIT EXPONENT/FRACTION
09600 ASH X,-243(W) ;FIX THE NUMBER
09700 LAC W,X ;LOAD IT INTO W
09800 FDOUT: IDIVI W,12
09900 HRLM X,(P)
10000 JUMPE W,.+2
10100 PUSHJ P,FDOUT
10200 CDR W,(P)
10300 ADDI W,"0"
10400 TTCALL 1,W
10500 SOJN Y,CPOPJ
10600 TTCALL 3,[ASCII/./]
10700 POPJ P,
10800 FLOUTE: PUSH P,Y ;SAVE FRACTION COUNT
10900 MOVEI Y,1 ;MAKE POINT COME AFTER 1 DIGIT
11000 PUSHJ P,FLOUTX ;CALL OTHER STUFF
11100 TTCALL 3,[ASCII/'/] ;WRITE FOR EXPONENT
11200 POP P,A ;RECOVER THE FRACTION COUNT
11300 GO DECOUT ;WRITE DECIMAL AND RETURN
11400
11500 RADIN: SETZB W,X ;NUMBER IN W. -POINT COUNT IN X
11600 TRZ F,CNGF+NEGF+PNTF ;ZERO FLAGS
11700 RADIN1: PUSHJ P,GETCHR
11800 TRNN F,DIGF
11900 GO RADIN2 ;NOT DIGIT
12000 CAIL A,"0"(Y) ;IS LEGAL
12100 POPJ P, ;ILLEGAL DIGIT
12200 IMUL W,Y
12300 ADDI W,-"0"(A)
12400 TRNE F,PNTF ;POINT SEEN YET?
12500 SUBI X,1 ;YES: COUNT IN X
12600 TRO F,CNGF ;MARK ATTEMPT TO CHANGE
12700 GO RADIN1 ;LOOP
12800 RADIN2: CAIE A,"." ;DECIMAL POINT
12900 GO RADIN3 ;NOPE
13000 TROE F,PNTF ;TURN ON POINT
13100 POPJ P, ;IT WAS SET BEFORE
13200 GO RADIN1 ;LOOP
13300 RADIN3: CAIE A,"-" ;IS IT THE SIGN?
13400 GO RADIN4
13500 TRNN F,CNGF+PNTF ;ANYTHING SEEN YET?
13600 TROE F,NEGF ;TURN ON FLAG
13700 POPJ P, ;LOSE
13800 GO RADIN1 ;WIN
13900 RADIN4: TRZE F,NEGF
14000 MOVN W,W ;NEGATE
14100 GO CPOPJ1 ;SKIP RETURN TO WIN!
14200
14300 OCTIN: MOVEI Y,10
14400 GO INRAD
14500 DECIN: MOVEI Y,12
14600 INRAD: PUSHJ P,RADIN
14700 POPJ P, ;LOSER
14800 CAIN A,12 ;MUST SEE LF
14900 JUMPE X,CPOPJ1 ;AND NO DIGITS PAST POINT
15000 POPJ P, ;LOSE
15100 FLIRT: MOVEI Y,12 ;SET RADIX
15200 PUSHJ P,RADIN
15300 POPJ P,
15400 CAIE A,"'"
15500 GO FLIRT1 ;NO EXPONENT
15600 PUSH P,W ;SAVE STUFF
15700 PUSH P,X
15800 PUSHJ P,DECIN
15900 GO FLIRTL ;LOSSAGE FROM FLIRT
16000 POP P,X ;GET OLD POINT COUNT
16100 ADD X,W ;MAKE REAL EXPONENT
16200 POP P,W ;GET DIGITS PART
16300 FLIRT1: CAIE A,12 ;END OF LINE?
16400 POPJ P, ;NOPE. LOSE
16500 FSC W,233
16600 JUMPE X,CPOPJ1 ;IF NO EXPONENT
16700 LAC Y,[10.0]
16800 JUMPG X,FLIRT2
16900 LAC Y,[0.1]
17000 MOVM X,X
17100 FLIRT2: FMPR W,Y
17200 SOJG X,.-1
17300 GO CPOPJ1
17400 FLIRTL: POP P,(P)
17500 POP P,(P)
17600 POPJ P,
17700 OHIN: MOVEI Y,10
17800 PUSHJ P,RADIN
17900 POPJ P,
18000 JUMPN X,CPOPJ
18100 CAIN A,12
18200 GO CPOPJ1
18300 CAIE A,","
18400 POPJ P,
18500 TTCALL 0,A
18600 CAIE A,","
18700 POPJ P,
18800 LAC C,W
18900 PUSHJ P,OCTIN
19000 POPJ P,
19100 HRL W,C
19200 GO CPOPJ1
00100 SUBTTL TABLES FOR THE PARAMETER MODIFICATION
00200 COMMENT/
00300 ENTRIES ARE:
00400 RADIX50 N,SYMBOL
00500 BOUND,,ADDRESS
00600 WHERE N HAS THE FOLLOWING SIGNIFIGANCE
00700 IF N≥40 THEN THE BOUND IS A LOWER BOUND. TAKE N MOD 40 FOR
00800 N=0 FLOATING POINT
00900 N=4 OCTAL
01000 N=10 DECIMAL
01100 N=14 OCTAL HALF WORDS
01200
01300 IF BOUND = 0 THEN THERE IS NO RESTRICTION
01400 /
01500 PTAB: RADIX50 0,BTX
01600 XWD 0,BTX
01700 RADIX50 0,GDT
01800 XWD 0,GDT
01900 RADIX50 0,BRX
02000 XWD 0,BRX
02100 RADIX50 0,GG
02200 XWD 0,GG
02300 RADIX50 0,MTCOLR
02400 XWD 0,MTCOLR
02500 RADIX50 0,TR2
02600 XWD 0,TR2
02700 RADIX50 0,SCR
02800 XWD 0,SCR
02900 RADIX50 4,NTORPS
03000 XWD NTORPM,NTORPS
03100 RADIX50 4,TTBMAX
03200 XWD LTBL,TTBMAX
03300 RADIX50 4,LATNCY
03400 XWD 0,LATNCY
03500 RADIX50 4,TLIFE
03600 XWD 200,TLIFE
03700 RADIX50 14,ITV
03800 XWD 0,ITV
03900 RADIX50 44,TRELOD
04000 XWD 20,TRELOD
04100 RADIX50 4,RSTARD
04200 XWD 0,RSTARD
04300 IFG HYPERS,<
04400 RADIX50 4,HYTIME
04500 XWD 0,HYTIME
04600 RADIX50 4,HYPEN
04700 XWD 0,HYPEN
04800 >
04900 RADIX50 4,DOTEAM
05000 XWD 0,DOTEAM
05100 RADIX50 10,SURBEN
05200 XWD 0,SURBEN
05300 RADIX50 10,KILLBN ;KILLER'S BENEFIT, WAGES OF SIN
05400 XWD 0,KILLBN
05500 RADIX50 10,DIEPEN ;PENALTY FOR DYING
05600 XWD 0,DIEPEN
05700 RADIX50 10,GSCORE ;SET TO DISPLAY GALAXY SCORE
05800 XWD 0,GSCORE
05900 SDEF(PTABX,.-1) ;DEFINE END OF TABLE
06000 IOTAB: XWD FLIRT,FLOUT
06100 XWD OCTIN,OCTOUT
06200 XWD DECIN,DECOUT
06300 XWD OHIN,OHOUT
06400 SDEF(UPDLEN,30) ;USER PUSHDOWN LENGTH
06500 UPDL: IOWD UPDLEN,UPDLST
06600 UPDLST: BLOCK UPDLEN
06700 > ;END OF IFG PARM
00100 SUBTTL DATA STORAGE FOR SPACEWAR
00200 TENDON: 0 ;SET -1 BY PDP-10 WHEN DONE.
00300 ;TESTED BY PDP-6. ZEROED WHEN PDP-6 RUNS
00400 SIXDON: 0 ;SET -1 WHEN PDP-6 FINISHES.
00500 ;TESTED AND CLEARED BY PDP-10
00600 CTIME: CTMX
00700 4
00800 CTMX: 0
00900 CTIM1: 0 ;SAVE DPY SELECT WORD HERE
01000 LVW(0,0,i,a,7,7) ;SELECT CENTER, BIG BRIGHT
01100 CTIM: 0
01200 CDOWN: 0
01300 DMASK: 0 ;DAMAGE MASK
01400 SAVSID: 0 ;USED BY DAMAGE ASSESSMENT
01500 DEBUG: 0 ;SET ≠0 TO FAKE SPACEWAR
01600 SWBUT: 0 ;SAVE OLD SW BUTTONS HERE
01700 NSHIPX: NSHIP-1 ;NUMBER OF SHIPS-1 TO USE
01800 DDSW: 0 ;SET ≠ 0 FOR NEW BUTTONS
01900 TUBES: 0 ;SET ≠0 FOR TWO TUBES
02000 DAMHIT: 0 ;SET ≠0 FOR PARTIAL DAMAGE
02100 RSPSWT: 0 ;SET ≠0 FOR RANDOM STARTS
02200 KILSUN: -1 ;SET =0 FOR NON-KILLER SUN
02300 CNTR: 0 ;SET ≠ 0 FOR SCORES
02400 HYPON: 0 ;SET ≠ 0 TO USE ALLOW HYPERSPACE
02500 KILLER: 0 ;SET ≠ 0 FOR KILLER SCORES
02600 TENSW: 0 ;SET ≠0 FOR SW ON THE 10
02700 SIXSW: 0 ;0 means PDP-6 is running.
02800 RCONST: 532473734251 ;A RANDOM CONSTANT
02900 RANDX: 352716643514 ;A RANDOM NUMBER
03000 RAND: 717271471534 ;YET ANOTHER RANDOM NUMBER
03100 DISTAB:
03200 STARFG: 0 ;SET -1 TO DISPLAY STARS
03300 SHIPFG: 0 ;SET -1 TO DISPLAY SHIPS
03400 CNTFG: 0 ;SET -1 TO DISPLAY COUNTS
03500 STADR: SUN ;ADDRESS OF STAR TABLE
03600 NSTAR+STARBF-SUN ;LENGTH OF STAR TABLE
03700 BPTRX: BUF ;ADDRESS OF DPY BUFFER
03800 0 ;CLOBBER THIS TO BUFFER LENGTH
03900 CNTPNT: CNTTBL ;ADDRESS OF COUNT TABLE
04000 1+2*NSHIP ;SIZE OF COUNT TABLE
04100 BITS: 0 ;KBD BITS
04200 OLINE: 0
04300 LINE: 0 ;DPY LINE NUMBER
04400 GSCORE: 0 ;SET ≠ 0 FOR GALAXY SCORE
04500 MINSTR: 0 ;>0⊃ TIME BEFORE RELAYING MINES
04600 PDP: IOWD PDLEN,PDLIST ;THE PUSH DOWN POINTER
04700 TAB: BLOCK 200 ;TABLE OF SINES AND COSINES
04800 CLOBR: 0 ;SET ≠ 0 AFTER HI CORE IS CLOBBERED
04900 PDLIST: BLOCK PDLEN ;STORAGE FOR PUSH DOWN LIST
05000 CNTTBL: BLOCK 3+2*NSHIP ;TABLE TO DISPLAY SCORES WITH
05100 TV: BLOCK LTBL ;TORPEDO VELOCITY -2Y,,2X
05200 TP: BLOCK LTBL ;TORPEDO POSITION -2Y,,2X
05300 TL: BLOCK LTBL ;TORPEDO REMAINING LIFE
05400 TVX: BLOCK LTBL ;TORPEDO X VELOCITY (FLOATING POINT)
05500 TVY: BLOCK LTBL ;TORPEDO Y VELOCITY (FLOATING POINT)
05600 NUMWN: BLOCK NSHIP ;WINS FOR EACH PLAYER
05700 SDEF(GOBEG,.) ;AREA TO ZERO AT GAME BEGINNING
05800 TPNT: 0 ;ACTIVE TORP COUNT
05900 QRSTRT: 0 ;<0 ⊃ TIME BEFORE RESTART
06000 ZOWSW: BLOCK NSHIP ;NON ZERO DENOTING EXPLOSION
06100 HYPER: BLOCK NSHIP ;POSITIVE ⊃ IN HYPERSPACE
06200 TCNT0: BLOCK NSHIP ;RELOAD DELAY: SHIP n TUBE 0
06300 TCNT1: BLOCK NSHIP ;RELOAD DELAY: SHIP n TUBE 1
06400 UTUBE: BLOCK NSHIP ;TUBE SELECT TOGGLE
06500 ZORCHP: BLOCK NSHIP ;SHIP'S ZORCH PROGRESS
06600 TPCN: BLOCK NSHIP ;REMAINING TORPEDO COUNT
06700 STEMP: BLOCK NSHIP ;NOSE POSITIONS
06800 SRA: BLOCK NSHIP ;LEFTSIDE BITS=ORIENTATION
06900 RESTAR: BLOCK NSHIP ;FOR AUTO RESTART COUNTS
07000 HYPCNT: BLOCK NSHIP ;# OF TIMES IN H-SPACE. &
07100 ;RANDOM NUMBER DURING ZORCH
07200 SR: BLOCK NSHIP ;BASIC ORIENTATION (ROT) 0-177
07300 SV: BLOCK NSHIP ;BASIC VELOCITY -2Y,,2X
07400 MINEV: BLOCK NMINE
07500 SP: BLOCK NSHIP ;BASIC POSITION -2Y,,2X
07600 MINEP: BLOCK NMINE
07700 SX: BLOCK NSHIP ;X POSITION FLOATING
07800 MINEX: BLOCK NMINE
07900 SY: BLOCK NSHIP ;Y POSITION (FLOATING)
08000 MINEY: BLOCK NMINE
08100 SVX: BLOCK NSHIP ;X VELOCITY (FLOATING)
08200 MINEVX: BLOCK NMINE
08300 SVY: BLOCK NSHIP ;Y VELOCITY (FLOATING)
08400 MINEVY: BLOCK NMINE
08500 SDEF(GOEND,.-1) ;END OF STUFF ZEROED BY GAME
08600 SDEF(JSTB,.) ;ZERO BEFORE READING BUTTONS
08700 STX: BLOCK NSHIP ;THRUST INCREMENT FOR SHIPS
08800 SRX: BLOCK NSHIP ;DELTA OMEGA (ROTATION)
08900 SDEF(JSTBX,.-1) ;END OF STUFF ZEROED BY JS
09000 IFN FAST,<
09100 BTX: 1.6 ;THRUST
09200 BRX: 2.0 ;ANGULAR VELOCITY OF ROTATION
09300 GG: 32.0 ;GRAVITATIONAL CONSTANT
09400 HYTIME: 100 ;TIME TO SPEND IN HYPERSPACE
09500 HYPEN: 100 ;HYPERSPACE RELOAD PENALTY
09600 ITV: 3400000 ;TORP VELOCITY
09700 TRELOD: 60 ;NORMAL RELOAD TIME
09800 >
09900 IFE FAST,< ;SLOW DEFAULTS
10000 BTX: 0.8 ;THRUST
10100 BRX: 1.0 ;ROTATIONAL D OMEGA/DT
10200 GG: 16.0 ;GRAV CONSTANT
10300 HYTIME: 200 ;HYPERSPACE-1 DURATION
10400 HYPEN: 40 ;HYPERSPACE-1 PENALTY
10500 ITV: 1600000 ;INITIAL TORPEDO VELOCITY
10600 TRELOD: 30 ;TUBE RELOAD DELAY
10700 >
10800 RSTARD: 400 ;RESTART DELAY
10900 MTCOLR: 100.0
11000 TR2: 36.0 ;TORPEDO RADIUS ↑ 2
11100 DOTEAM: 0 ;SET ≠ 0 IF USING TEAM SCORING
11200 SURBEN: 1 ;SURVIVAL BENEFIT
11300 DIEPEN: 0 ;PENALTY FOR DYING: DEATH PENALTY
11400 KILLBN: 0 ;REWARD FOR KILLING, WAGES OF SIN
11500 GALAXY: 0 ;SCORE FOR OVERHEAD
11600 GDT: 6.0 ;DELTA T FOR INTEGRATION
11700 SCR: 10.0 ;SUN COLISION RADIUS
11800 NTORPS: NTORPM ;NUMBER OF TORPS/PLAYER
11900 NMINEX: NMINE ;MAXIMUM NUMBER OF MINES ≤ NMINE
12000 TTBMAX: LTBL ;MAXIMUM TORPS IN TABLE ≤ LTBL
12100 LATNCY: 10 ;MIN TIME BETWEEN SHOTS (TUBES)
12200 TLIFE: 200 ;TORPEDO LIFE
12300 RDELAY: XWD SHIP,TCNT0 ;@RDELAY(X) WILL GET/SET RELOAD
12400 XWD SHIP,TCNT1 ;DELAY FOR SHIP'S TUBE (X).
12500 STTB1: NMINEX ;NUMBER OF OBJECTS FOR STCOL (MINES)
12600 TPNT ;DITTO, TORPEDOES
12700 STTB2: XWD R11,MINEP ;STCOL: OBJECT POSITION TABLE ADDRESS
12800 XWD R11,TP ;TORPEDOES, (LAST LINE WAS MINES)
12900 STTB3: XWD R11,MINEP ;ZERO THIS TO CANCEL OBJECT (MINE)
13000 XWD R11,TL ;CANCEL TORPEDO
13100 TFTAB: 10 ;FLAME LOCATOR FOR SHIPS
13200 12 ;FLAME POSITION =
13300 13 ;SP(SHIP)-TAB(SR(SHIP))*TFTAB(SHIP)
13400 14
13500 14
13600 SPTAB: 14 ;DIDDLE TO GET SHIP NOSE
13700 14 ;SHIP NOSE POSITION =
13800 14 ;SP(SHIP)+TAB(SR(SHIP))*SPTAB(SHIP)
13900 14
14000 14
14100 SPICT: S1TAB ;TABLE OF PICTURE ADDRESSES
14200 S2TAB
14300 S3TAB ;ARE ASSEMBLED
14400 S4TAB
14500 S5TAB
14600 TPBIT: 1 ;BIT SIGNIFYING TORP LAUNCH
14700 20
14800 400
14900 10000
15000 200000
15100 ALLBIT: 17 ;BUTTON BITS FOR EACH SHIP
15200 360
15300 7400
15400 170000
15500 3600000
15600 THRUBT: 2
15700 40
15800 1000
15900 20000
16000 400000
16100 ROTRBT: 4
16200 100
16300 2000
16400 40000
16500 1000000
16600 ROTLBT: 10
16700 200
16800 4000
16900 100000
17000 2000000
17100 HYPRBT: 14
17200 300
17300 6000
17400 140000
17500 3000000
17600 IPOS: BLOCK NSHIP ;INITIAL POSITIONS
17700 IROT: BLOCK NSHIP
17800 COUNTP: BLOCK NSHIP
17900 GLOC: LVW(10,10,i,a,5,5)
18000 S1TAB: XWD -4,70 ;SHIP 1 PICTURE
18100 XWD -21,100
18200 XWD -4,60
18300 XWD -6,0
18400 XWD -4,160
18500 XWD -3,140
18600 XWD -4,120
18700 XWD -6,100
18800 XWD -4,20
18900 XWD -3,40
19000 XWD -3,140
19100 XWD -20,0
19200 XWD -4,10
19300 0
19400 S2TAB: XWD -4,70
19500 XWD -23,100
19600 XWD -3,30
19700 XWD -6,0
19800 XWD -3,150
19900 XWD -3,140
20000 XWD -3,130
20100 XWD -6,100
20200 XWD -3,50
20300 XWD -3,40
20400 XWD -3,140
20500 XWD -22,0
20600 XWD -4,10
20700 ZERO: 0
20800 S3TAB: XWD -4,70
20900 XWD -23,100
21000 XWD -3,40
21100 XWD -6,0
21200 XWD -4,152
21300 XWD -2,140
21400 XWD -4,126
21500 XWD -6,100
21600 XWD -6,40
21700 XWD -3,140
21800 XWD -23,0
21900 XWD -4,10
22000 0
22100 S4TAB: XWD -4,70
22200 XWD -23,100
22300 XWD -4,40
22400 XWD -10,165
22500 XWD -4,140
22600 XWD -10,112
22700 XWD -7,40
22800 XWD -3,140
22900 XWD -23,0
23000 XWD -4,12
23100 0
23200 S5TAB: XWD -4,70
23300 XWD -23,100
23400 XWD -2,60
23500 XWD -4,20
23600 XWD -6,160
23700 XWD -4,140
23800 XWD -6,120
23900 XWD -4,60
24000 XWD -2,20
24100 XWD -4,40
24200 XWD -3,140
24300 XWD -23,0
24400 XWD -4,12
24500 0
24600 LIT
24700 SUN: 0
24800 SELWRD: 1
24900 lvw(-12,-10,i,a,7,2) ;CENTER FOR THE SUN
25000 <ASCIZ /⊗/>+1 ;THE SUN ITSELF
25100 STARBF:
25200 BUF: BLOCK BUFLEN ;THE BUFFER FOR THE WORLD
00100 SUBTTL ONCE ONLY SET PARAMETERS AT STARTUP
00200 SETALL: TTCALL 3,[ASCIZ/WELCOME TO SPACEWAR.
00300 HOW MANY SHIPS? MAXIMUM IS /]
00400 MOVEI A,NSHIP
00500 PUSHJ P,%DEC
00600 TTCALL 3,[ASCIZ/ /]
00700 PUSHJ P,%DIGIN
00800 SOJGE A,.+2
00900 MOVEI A,1 ;TWO SHIPS IF CR
01000 CAIL A,NSHIP
01100 MOVEI A,NSHIP-1
01200 DAC A,NSHIPX
01300 CAILE A,1
01400 GO %SDD
01500 TTCALL 3,[ASCIZ/KEYBOARD BUTTONS? (ELSE REGULAR). TYPE Y OR N: /]
01600 PUSHJ P,%YN
01700 TDZA A,A
01800 %SDD: MOVEI A,1
01900 DAC A,DDSW ;SAVE DDSW
02000 LAC A,NSHIPX
02100 CAILE A,1 ;1 OR 2 PERSON GAME?
02200 GO %STD1 ;NO ASK ABOUT STANDARD FOR >2
02300 TTCALL 3,[ASCIZ/THE "STANDARD" GAME IS:
02400 1 CONSOLE, 2 TORPEDO TUBES, (NORMAL) SCORING,
02500 NO PARTIAL DAMAGE, NO HYPERSPACE, KILLER SUN.
02600 SHIPS START IN STANDARD POSITIONS.
02700 TYPE Y TO GET A STANDARD GAME: /]
02800 PUSHJ P,%YN
02900 GO %SELPM
03000 GO %STG2 ;STANDARD FOR 2.
03100 %STD1: TTCALL 3,[ASCIZ/THE "STANDARD" GAME IS:
03200 1 CONSOLE, 2 TORPEDO TUBES, KILLER SCORING,
03300 NO PARTIAL DAMAGE, NO HYPERSPACE, KILLER SUN.
03400 SHIPS START IN STANDARD POSITIONS.
03500 TYPE Y TO GET A STANDARD GAME: /]
03600 PUSHJ P,%YN
03700 GO %SELPM ;SELECT PARAMETERS.
03800 MOVEI A,1
03900 SETOM KILLER
04000 DAC A,KILLBN
04100 DAC A,DIEPEN
04200 %STG2: MOVEI A,1
04300 DAC A,TUBES
04400 DZM DAMHIT
04500 DZM DOTEAM
04600 DZM HYPON
04700 DZM OLINE
04800 DZM RSPSWT
04900 DAC A,SELWRD
05000 MOVEI A,NMINE
05100 DAC A,NMINEX
05200 SETOM CNTR
05300 GO %GO
05400 %SELPM: TTCALL 3,[ASCIZ/SECOND CONSOLE? NUMBER ELSE RETURN: /]
05500 PUSHJ P,%DIGIN
05600 JUMPE A,%NOTHR ;NO OTHER
05700 SUBI A,24 ;RESET TO REASONABLENESS
05800 JUMPL A,%NOTHR
05900 CAILE A,5
06000 GO %NOTHR
06100 ; CALCULATE SELECT BIT FOR DPYOUT
06200 MOVN B,A
06300 MOVSI C,400000
06400 LSH C,(B)
06500 TRO C,10 ;MAKE IT A SELECT
06600 DAC C,SELWRD ;SAVE SELECTOR WORD
06700 TRO A,100
06800 DAC A,OLINE ;SAVE AS THE OTHER LINE NUMBER
06900 GO %NOTHX
07000 %NOTHR: DZM OLINE
07100 MOVEI A,1
07200 DAC A,SELWRD
07300 %NOTHX:
07400 IFG NMINE,<
07500 MOVEI A,NMINE
07600 TTCALL 3,[ASCIZ/HOW MANY SPACE-MINES DO YOU WANT?
07700 CHOOSE FROM 0 TO /]
07800 PUSHJ P,%DEC
07900 TTCALL 3,[ASCIZ/ /]
08000 PUSHJ P,%DIGIN
08100 CAILE A,NMINE
08200 MOVEI A,NMINE
08300 DAC A,NMINEX
08400 >
08500 TTCALL 3,[ASCIZ/PARTIAL DAMAGE? /]
08600 PUSHJ P,%YN
08700 TDZA A,A
08800 MOVEI A,1
08900 DAC A,DAMHIT
09000 TTCALL 3,[ASCIZ/DISPLAY SCORES? /]
09100 PUSHJ P,%YN
09200 TDZA A,A
09300 MOVEI A,1
09400 DAC A,CNTR
09500 TTCALL 3,[ASCIZ/TWO TORPEDO TUBES? /]
09600 PUSHJ P,%YN
09700 TDZA A,A
09800 MOVEI A,1
09900 DAC A,TUBES
10000 SKIPN CNTR
10100 GO %NK
10200 LAC A,NSHIPX
10300 CAIE A,3
10400 GO %NTS
10500 TTCALL 3,[ASCIZ/TEAM SCORES? /]
10600 PUSHJ P,%YN
10700 %NTS: TDZA A,A
10800 MOVEI A,1
10900 DAC A,DOTEAM
11000 TTCALL 3,[ASCIZ/KILLER SCORE? /]
11100 PUSHJ P,%YN
11200 GO %NK
11300 SETOM KILLER
11400 MOVEI A,1
11500 DAC A,KILLBN
11600 DAC A,DIEPEN
11700 %NK: DZM HYPON
11800 IFN HYPERS+NHYP,<
11900 TTCALL 3,[ASCIZ/HYPERSPACE? /]
12000 PUSHJ P,%YN
12100 TDZA A,A
12200 MOVEI A,1
12300 DAC A,HYPON
12400 >
12500 TTCALL 3,[ASCIZ /"RANDOM" STARTING POSITIONS?/]
12600 PUSHJ P,%YN
12700 TDZA A,A
12800 MOVEI A,1
12900 DAC A,RSPSWT
13000 %GO: LAC A,NSHIPX
13100 LAC B,%CDIR(A)
13200 LAC C,%IPOS(A)
13300 LAC D,%IROT(A)
13400 ZAC W,
13500 %IL: LAC X,0(B)
13600 DAC X,COUNTP(W)
13700 LAC X,0(C)
13800 DAC X,IPOS(W)
13900 LAC X,0(D)
14000 DAC X,IROT(W)
14100 ADDI B,1
14200 ADDI C,1
14300 ADDI D,1
14400 ADDI W,1
14500 SOJGE A,%IL
14600 GO %XIT
00100 SUBTTL MORE ONCE ONLY
00200 %XIT: SKIPE JOBDDT
00300 POPJ P,
00400 MOVEI A,SETALL-1
00500 CORE A, ;CUT BACK THE CORE
00600 JFCL
00700 SETOM CLOBR
00800 POPJ P, ;RETURN
00900 %YN: TTCALL 4,A
01000 TTCALL 11,
01100 CAIE A,"Y"
01200 CAIN A,"y"
01300 AOS (P)
01400 POPJ P,
01500 %DEC: IDIVI A,12
01600 HRLM B,(P)
01700 SKIPE A
01800 PUSHJ P,%DEC
01900 CDR A,(P)
02000 ADDI A,"0"
02100 TTCALL 1,A
02200 POPJ P,
02300 %DIGIN: ZAC A,
02400 %DIG1: TTCALL 4,B
02500 CAIL B,"0"
02600 CAILE B,"9"
02700 GO %DIG2
02800 IMULI A,12
02900 ADDI A,-"0"(B)
03000 GO %DIG1
03100 %DIG2: TTCALL 11,
03200 POPJ P,
00100 SUBTTL CONSTANTS
00200 %CDIR: %CP124
00300 %CP124
00400 %CP3
00500 %CP124
00600 %CP5
00700 %IPOS: %IP124
00800 %IP124
00900 %IP3
01000 %IP124
01100 %IP5
01200 %IROT: %IRT12
01300 %IRT12
01400 %IRT3
01500 %IRT4
01600 %IRT5
01700 %IP124: XWD -200000,200000
01800 XWD 200000,-200000
01900 XWD -200000,-200000
02000 XWD 200000,200000
02100 %IP3: XWD -240000,0 ;SHIP 1 AT TOP CENTER
02200 XWD 110000,220000 ;SHIP 2 AT 4 OCLOCK
02300 XWD 110000,-220000 ;SHIP 3 AT 8 OCLOCK
02400 %IP5: XWD -240000,0
02500 XWD -50000,230000
02600 XWD 200000,140000
02700 XWD 200000,-140000
02800 XWD -50000,-230000
02900 %IRT4: 120 ;POINT TO THE SUN
03000 20
03100 60
03200 160
03300 %IRT12: 100
03400 0
03500 %IRT3: 100
03600 153
03700 25
03800 %IRT5: 100
03900 131
04000 163
04100 14
04200 46
04300 %CP124: LVW(640,640,i,a,5,5)
04400 LVW(-700,-700,i,a,5,5)
04500 LVW(-700,640,i,a,5,5)
04600 LVW(640,-700,i,a,5,5)
04700 %CP3: LVW(-40,640,i,a,5,5)
04800 LVW(640,-700,i,a,5,5)
04900 LVW(-700,-700,i,a,5,5)
05000 %CP5: LVW(-40,640,i,a,5,5)
05100 LVW(640,300,i,a,5,5)
05200 LVW(500,-700,i,a,5,5)
05300 LVW(-540,-700,i,a,5,5)
05400 LVW(-700,300,i,a,5,5)
05500 END STRT ;FINALLY, THE END